Cadenas

REGEXP_SUBSTR

Devuelve el primer fragmento de una cadena que encaja con una expresión regular, como texto normal.

Sintaxis

REGEXP_SUBSTR(<texto>, '<patrón>')
REGEXP_SUBSTR(<texto>, '<patrón>', <inicio>, <número de coincidencia>)
REGEXP_SUBSTR(<texto>, '<patrón>', <inicio>, <número de coincidencia>, '<opciones>')

La hermana sencilla de REGEXP_MATCHES: devuelve texto en lugar de un array y, si no hay coincidencia, NULL, así que la fila de la tabla no desaparece del resultado. Los argumentos adicionales indican desde qué posición buscar, qué coincidencia tomar y opciones como 'i'. Apareció en PostgreSQL 15.

Datos para los ejemplos

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

El primer número
SELECT REGEXP_SUBSTR('Order 1234, box 56', '[0-9]+') AS first_number;
first_number
1234
La segunda coincidencia
SELECT REGEXP_SUBSTR('Order 1234, box 56', '[0-9]+', 1, 2) AS second_number;
second_number
56

1: buscar desde el primer carácter; 2: tomar la segunda coincidencia.

Las seis últimas cifras del teléfono
SELECT name, phone,
REGEXP_SUBSTR(phone, '[0-9]{6}$') AS last_six
FROM employees;
namephonelast_six
Emma+44 7700 900123900123
LiamNULLNULL
Olivia+44 7700 900456900456
Noah+44 7700 900789900789
SophiaNULLNULL

Donde no hay teléfono, el resultado es NULL y la fila se mantiene.

Ten en cuenta

Toma la primera coincidencia, no la más larga: REGEXP_SUBSTR('a1b22', '[0-9]+') da 1, no 22.

Las mayúsculas importan. Para no distinguirlas, pasa la opción 'i' como quinto argumento: REGEXP_SUBSTR('PostgreSQL', 'sql', 1, 1, 'i') da SQL.

Solo existe desde PostgreSQL 15. En versiones anteriores: SUBSTRING(<texto> FROM '<patrón>') o (REGEXP_MATCHES(<texto>, '<patrón>'))[1].