Extraer parte de cadena en PostgreSQL usando substring

En este post sobre PostgreSQL te mostraré cómo usar la función substring para extraer parte de una cadena o cortar una cadena.

También te mostraré cómo convertir el valor a texto para que satisfaga los argumentos de la función.

La función substring

Esta función toma los siguientes argumentos en orden:

  1. La cadena de la que se extrae la otra cadena, o también la cadena que se va a cortar
  2. La posición desde donde comenzar a extraer la cadena. Comienza en 1
  3. Cuántos caracteres extraer

Podemos usar cadenas literales o campos que ya existan. Otra forma que también funciona es:

substring(cadena from [posición] for [cuántos])

Lo veremos más a detalle con los ejemplos.

Ejemplos de substring

Tengo la siguiente tabla que tiene nombre y fecha de registro de usuarios. El tipo de dato del nombre es text, pero el de la fecha es date; más adelante verás la razón.

Si queremos extraer las primeras dos letras entonces podemos comenzar la extracción desde la posición 1, y luego tomar 2:

pruebas=# -- Mostramos todos los nombres
pruebas=# select * from nombres;
 nombre | fecha_registro
--------+----------------
 Luis   | 2020-04-03
 Maggie | 2020-04-04
 Pedro  | 2020-04-04
(3 filas)


pruebas=# -- Ahora extraemos las primeras 2 letras
pruebas=# select substring(nombre, 1, 2) from nombres;
 substring
-----------
 Lu
 Ma
 Pe
(3 filas)


pruebas=#

Lo mismo funcionaría usando la sintaxis de from y for:

pruebas=# select substring(nombre from 1 for 2) from nombres;
 substring
-----------
 Lu
 Ma
 Pe
(3 filas)


pruebas=#

Ahora mostraré otro ejemplo en donde extraemos la tercer letra. Quedaría así: select substring(nombre,3, 1) from nombres;

Con la siguiente salida:

pruebas=# select substring(nombre,3, 1) from nombres;
 substring
-----------
 i
 g
 d
(3 filas)


pruebas=#

Como lo mencioné anteriormente, también funciona con cadenas literales:

pruebas=# select substring('Parzibyte',6, 4);
 substring
-----------
 byte
(1 fila)

Casteando datos

Ahora vamos a suponer que queremos extraer los primeros 4 dígitos de la fecha de registro; es decir, el año. (no tiene mucho sentido pero sirve para ejemplo).

La consulta sería algo así:

select substring(fecha_registro, 1, 4) as año, nombre from nombres;

Pero al intentar ejecutarla, la salida es:

pruebas=# select substring(fecha_registro, 1, 4) as año, nombre from nombres;
ERROR:  no existe la función pg_catalog.substring(date, integer, integer)
LÍNEA 1: select substring(fecha_registro, 1, 4) as a¤o, nombre from n...
                ^
SUGERENCIA:  Ninguna función coincide en el nombre y tipos de argumentos. Puede ser necesario agregar conversión explícita de tipos.

El error es claro y dice: no existe la función pg_catalog.substring(date, integer, integer).

Quiere decir que no existe una función definida con ese tipo de datos; ya que existe una que recibe como primer argumento un tipo text.

Por lo tanto simplemente podemos castear como nos lo sugiere (fíjate en el ::text):

select substring(fecha_registro::text, 1, 4) as año, nombre from nombres;

Y ahora sí funciona de maravilla:

Función substring en PostgreSQL – Extraer cadena

Esto es porque la función espera un parámetro de tipo text al inicio, y nosotros le estábamos enviando uno de tipo date; lo cual se soluciona casteando o convirtiendo el tipo de dato.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *