[discrete]
[[esql-substring]]
=== `SUBSTRING`

*Syntax*

[.text-center]
image::esql/functions/signature/substring.svg[Embedded,opts=inline]

*Parameters*

`str`::
String expression. If `null`, the function returns `null`.

`start`::
Start position.

`length`::
Length of the substring from the start position. Optional; if omitted, all
positions after `start` are returned.

*Description*

Returns a substring of a string, specified by a start position and an optional
length.

include::types/substring.asciidoc[]

*Examples*

This example returns the first three characters of every last name:

[source.merge.styled,esql]
----
include::{esql-specs}/docs.csv-spec[tag=substring]
----
[%header.monospaced.styled,format=dsv,separator=|]
|===
include::{esql-specs}/docs.csv-spec[tag=substring-result]
|===

A negative start position is interpreted as being relative to the end of the
string. This example returns the last three characters of of every last name:

[source.merge.styled,esql]
----
include::{esql-specs}/docs.csv-spec[tag=substringEnd]
----
[%header.monospaced.styled,format=dsv,separator=|]
|===
include::{esql-specs}/docs.csv-spec[tag=substringEnd-result]
|===

If length is omitted, substring returns the remainder of the string. This
example returns all characters except for the first:

[source.merge.styled,esql]
----
include::{esql-specs}/docs.csv-spec[tag=substringRemainder]
----
[%header.monospaced.styled,format=dsv,separator=|]
|===
include::{esql-specs}/docs.csv-spec[tag=substringRemainder-result]
|===
