

 Amazon Redshift dejará de admitir la creación de nuevas UDF de Python a partir del parche 198. Las UDF de Python existentes seguirán funcionando hasta el 30 de junio de 2026. Para obtener más información, consulte la [publicación del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

# Función SUBSTRING
<a name="r_SUBSTRING"></a>

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
<a name="r_SUBSTRING-synopsis"></a>

```
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
<a name="r_SUBSTRING-arguments"></a>

 *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
<a name="r_SUBSTRING-return-type"></a>

VARCHAR o VARBYTE en función de la entrada.

## Notas de uso
<a name="r_SUBSTRING_usage_notes"></a>

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
<a name="r_SUBSTRING-examples"></a>

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
```