En SQL, las expresiones regulares (RegEx) permiten buscar y manipular texto mediante patrones. Estas son extremadamente útiles para validar datos, realizar búsquedas avanzadas, y transformar información.
Diferentes bases de datos soportan expresiones regulares de manera distinta. A continuación, te explico cómo usarlas en PostgreSQL, MySQL y Oracle.
1. PostgreSQL y expresiones regulares
Operadores comunes
~ : Coincide con un patrón (sensible a mayúsculas y minúsculas).
~*: Coincide con un patrón (insensible a mayúsculas y minúsculas).
!~ : No coincide con un patrón (sensible a mayúsculas y minúsculas).
!~*: No coincide con un patrón (insensible a mayúsculas y minúsculas).
Ejemplo: Buscar nombres que comienzan con "A"
SELECT nombre
FROM usuarios
WHERE nombre ~ '^A';
Explicación: El patrón ^A busca cadenas que empiezan con la letra "A".
Ejemplo: Buscar cadenas que terminan en un número
SELECT nombre
FROM usuarios
WHERE nombre ~ '[0-9]$';
Explicación: [0-9]$ busca cadenas que terminan con un dígito.
Funciones relacionadas
regexp_matches: Devuelve las coincidencias encontradas.
regexp_replace: Reemplaza texto basado en un patrón.
Ejemplo: Reemplazar espacios por guiones bajos
SELECT regexp_replace(nombre, ' ', '_', 'g') AS nombre_modificado
FROM usuarios;
Explicación: Reemplaza todos los espacios por guiones bajos.
Ejemplo: Extraer el dominio de un correo electrónico
SELECT regexp_matches(email, '@(.+)$') AS dominio
FROM usuarios;
Explicación: Extrae todo después del símbolo @.
2. MySQL y expresiones regulares
En MySQL, se utiliza la función REGEXP para trabajar con expresiones regulares.
Operadores comunes
REGEXP o RLIKE: Para buscar coincidencias con un patrón.
NOT REGEXP: Para buscar lo que no coincide con el patrón.
Ejemplo: Buscar correos con dominio "gmail.com"
SELECT email
FROM usuarios
WHERE email REGEXP 'gmail\\.com$';
Explicación: Busca correos que terminan con gmail.com. Se usa \\. para escapar el punto.
Ejemplo: Validar números de teléfono (10 dígitos)
SELECT telefono
FROM usuarios
WHERE telefono REGEXP '^[0-9]{10}$';
Explicación: ^[0-9]{10}$ busca cadenas con exactamente 10 dígitos.
Funciones relacionadas
REGEXP_REPLACE: Introducido en MySQL 8.0 para reemplazar texto basado en un patrón.
Ejemplo: Reemplazar guiones en números de teléfono
SELECT REGEXP_REPLACE(telefono, '-', '') AS telefono_limpio
FROM usuarios;
Explicación: Elimina todos los guiones de la columna telefono.
3. Oracle y expresiones regulares
Oracle incluye funciones avanzadas para expresiones regulares como REGEXP_LIKE, REGEXP_REPLACE, REGEXP_INSTR y REGEXP_SUBSTR.
Ejemplo: Buscar nombres que contienen números
SELECT nombre
FROM usuarios
WHERE REGEXP_LIKE(nombre, '[0-9]');
Explicación: Busca nombres que contengan algún dígito.
Reemplazar texto con REGEXP_REPLACE
Ejemplo: Convertir texto a minúsculas
SELECT REGEXP_REPLACE(nombre, '[A-Z]', LOWER('\0')) AS nombre_minusculas
FROM usuarios;
Explicación: Reemplaza todas las letras mayúsculas por minúsculas.
Extraer texto con REGEXP_SUBSTR
Ejemplo: Extraer el código postal de una dirección
SELECT REGEXP_SUBSTR(direccion, '[0-9]{5}') AS codigo_postal
FROM usuarios;
Explicación: Extrae un número de 5 dígitos (código postal) de la columna direccion.
Patrones comunes en SQL
PatrónDescripción^Inicio de la cadena.$Fin de la cadena..Cualquier carácter.[abc]Coincide con cualquiera de a, b o c.[^abc]No coincide con a, b o c.[a-z]Coincide con letras minúsculas de la a a la z.[0-9]Coincide con dígitos del 0 al 9.\dCualquier dígito (igual a [0-9]).\wCualquier carácter alfanumérico o guion bajo.\sCualquier espacio en blanco.{n}Exactamente n repeticiones.{n,}Al menos n repeticiones.{n,m}Entre n y m repeticiones.*Cero o más repeticiones.+Una o más repeticiones.?Cero o una repetición.