Función SUBSTRING - Amazon Redshift

Función SUBSTRING

Devuelve el subconjunto de una cadena basado en la posición inicial especificada.

Si la entrada es una cadena de caracteres, la posición inicial y el número de caracteres extraídos se basan en caracteres, y no en bytes, de modo tal que los caracteres de varios bytes se cuentan como si fueran simples. Si la entrada es una expresión binaria, la posición inicial y la subcadena extraída se basan en bytes. No puede especificar una longitud negativa, pero puede especificar una posición de inicio negativa.

Sintaxis

SUBSTRING(character_string FROM start_position [ FOR number_characters ] )
SUBSTRING(character_string, start_position, number_characters )
SUBSTRING(binary_expression, start_byte, number_bytes )
SUBSTRING(binary_expression, start_byte )

Argumentos

character_string

La cadena que se buscará. Los tipos de datos que no son caracteres se tratan como una cadena.

start_position

La posición dentro de la cadena para comenzar la extracción, comenzando en 1. En valor de start_position (posición_de_inicio) se basa en la cantidad de caracteres, no bytes, por lo que los caracteres multibyte se cuentan como caracteres simples. Este número puede ser negativo.

number_characters

La cantidad de caracteres para extraer (la longitud de la subcadena). El valor de number_characters (número_de_caracteres) se basa en la cantidad de caracteres, no bytes, por lo que los caracteres multibyte se cuentan como caracteres simples. Este número no puede ser negativo.

binary_expression

La expresión_binaria del tipo de datos VARBYTE que se buscará.

start_byte

La posición dentro de la expresión binaria desde donde comienza la extracción, con punto de partida en 1. Este número puede ser negativo.

number_bytes

La cantidad de bytes para extraer, es decir, la longitud de la subcadena. Este número no puede ser negativo.

Tipo de retorno

VARCHAR o VARBYTE en función de la entrada.

Notas de uso

A continuación, encontrará algunos ejemplos de cómo puede utilizar start_position y number_characters para extraer subcadenas desde varias posiciones de una cadena.

El siguiente ejemplo devuelve una cadena de cuatro caracteres comenzando con el sexto carácter.

select substring('caterpillar',6,4); substring ----------- pill (1 row)

Si start_position + number_characters supera la longitud de la cadena, SUBSTRING devuelve una subcadena que comienza en start_position y llega hasta el final de la cadena. Por ejemplo:

select substring('caterpillar',6,8); substring ----------- pillar (1 row)

Si start_position es negativo o 0, la función SUBSTRING devuelve una cadena que comienza en el primer carácter de la cadena con una longitud de start_position + number_characters -1. Por ejemplo:

select substring('caterpillar',-2,6); substring ----------- cat (1 row)

Si start_position + number_characters -1 es menor o igual a cero, SUBSTRING devuelve una cadena vacía. Por ejemplo:

select substring('caterpillar',-5,4); substring ----------- (1 row)

Ejemplos

El siguiente ejemplo devuelve el mes de la cadena LISTTIME en la tabla LISTING:

select listid, listtime, substring(listtime, 6, 2) as month from listing order by 1, 2, 3 limit 10; listid | listtime | month --------+---------------------+------- 1 | 2008-01-24 06:43:29 | 01 2 | 2008-03-05 12:25:29 | 03 3 | 2008-11-01 07:35:33 | 11 4 | 2008-05-24 01:18:37 | 05 5 | 2008-05-17 02:29:11 | 05 6 | 2008-08-15 02:08:13 | 08 7 | 2008-11-15 09:38:15 | 11 8 | 2008-11-09 05:07:30 | 11 9 | 2008-09-09 08:03:36 | 09 10 | 2008-06-17 09:44:54 | 06 (10 rows)

El siguiente ejemplo es igual al anterior, pero utiliza la opción FROM...FOR:

select listid, listtime, substring(listtime from 6 for 2) as month from listing order by 1, 2, 3 limit 10; listid | listtime | month --------+---------------------+------- 1 | 2008-01-24 06:43:29 | 01 2 | 2008-03-05 12:25:29 | 03 3 | 2008-11-01 07:35:33 | 11 4 | 2008-05-24 01:18:37 | 05 5 | 2008-05-17 02:29:11 | 05 6 | 2008-08-15 02:08:13 | 08 7 | 2008-11-15 09:38:15 | 11 8 | 2008-11-09 05:07:30 | 11 9 | 2008-09-09 08:03:36 | 09 10 | 2008-06-17 09:44:54 | 06 (10 rows)

No se puede utilizar SUBSTRING para extraer de forma predecible el prefijo de una cadena que pueda contener caracteres de varios bytes, ya que es necesario especificar la longitud de una cadena de varios bytes en función de la cantidad de bytes, y no de la cantidad de caracteres. Para extraer el segmento inicial de una cadena en función de la longitud en bytes, puede utilizar CAST y convertir la cadena en VARCHAR(byte_length) para truncarla, donde byte_length es la longitud requerida. En el siguiente ejemplo, se extraen los 5 primeros bytes de la cadena 'Fourscore and seven'.

select cast('Fourscore and seven' as varchar(5)); varchar ------- Fours

En el siguiente ejemplo, se muestra una posición inicial negativa de un valor binario abc. Dado que la posición inicial es -3, la subcadena se extrae desde el principio del valor binario. El resultado se muestra automáticamente como representación hexadecimal de la subcadena binaria.

select substring('abc'::varbyte, -3); substring ----------- 616263

En el siguiente ejemplo, se muestra un 1 en la posición inicial de un valor binario abc. Debido a que no se especifica la longitud, la cadena se extrae desde la posición inicial hasta el final de la cadena. El resultado se muestra automáticamente como representación hexadecimal de la subcadena binaria.

select substring('abc'::varbyte, 1); substring ----------- 616263

En el siguiente ejemplo, se muestra un 3 en la posición inicial de un valor binario abc. Debido a que no se especifica la longitud, la cadena se extrae desde la posición inicial hasta el final de la cadena. El resultado se muestra automáticamente como representación hexadecimal de la subcadena binaria.

select substring('abc'::varbyte, 3); substring ----------- 63

En el siguiente ejemplo, se muestra un 2 en la posición inicial de un valor binario abc. La cadena se extrae desde la posición inicial hasta la posición 10; no obstante, el final de la cadena se encuentra en la posición 3. El resultado se muestra automáticamente como representación hexadecimal de la subcadena binaria.

select substring('abc'::varbyte, 2, 10); substring ----------- 6263

En el siguiente ejemplo, se muestra un 2 en la posición inicial de un valor binario abc. La cadena se extrae a partir de la posición inicial de 1 byte. El resultado se muestra automáticamente como representación hexadecimal de la subcadena binaria.

select substring('abc'::varbyte, 2, 1); substring ----------- 62

El ejemplo siguiente devuelve el nombre Ana que aparece después del último espacio de la cadena de entrada Silva, Ana.

select reverse(substring(reverse('Silva, Ana'), 1, position(' ' IN reverse('Silva, Ana')))) reverse ----------- Ana