Funciones de texto: limpiar, cortar y unir
BásicoLas más usadas: lower/upper (minúsculas/mayúsculas), trim (quita espacios al inicio y al final), length (cantidad de caracteres), replace(texto, busca, reemplazo), split_part(texto, separador, n) (la parte número n) y concat(…) o || para unir textos. Se suelen combinar para normalizar datos antes de comparar o agrupar.
Sintaxis
lower(trim(texto))
split_part(email, '@', 2)
replace(texto, 'viejo', 'nuevo')
concat(a, ' - ', b)
a || ' - ' || bEjemplo
SELECT
c.id,
c.email,
lower(trim(c.email)) AS email_normalizado,
split_part(lower(trim(c.email)), '@', 1) AS usuario,
length(c.email) AS caracteres
FROM customers AS c
WHERE c.email <> lower(trim(c.email))
ORDER BY c.id
LIMIT 4;Resultado
| id | email_normalizado | usuario | caracteres | |
|---|---|---|---|---|
| 145 | JULIETA.CASTRO109@EJEMPLO.LAT | julieta.castro109@ejemplo.lat | julieta.castro109 | 29 |
| 251 | SEBASTIAN.GONZALEZ199@EJEMPLO.LAT | sebastian.gonzalez199@ejemplo.lat | sebastian.gonzalez199 | 33 |
| 271 | MARIANA.ROMERO155@EJEMPLO.LAT | mariana.romero155@ejemplo.lat | mariana.romero155 | 29 |
| 280 | JULIETA.NAVARRO4@EJEMPLO.LAT | julieta.navarro4@ejemplo.lat | julieta.navarro4 | 28 |
Cómo leerlo
El filtro encuentra correos guardados en mayúsculas: JULIETA.CASTRO109@EJEMPLO.LAT y julieta.castro109@ejemplo.lat son el mismo correo, pero = los trata como textos distintos. lower(trim(…)) los deja en un formato único; trim no cambia nada aquí, pero protege contra espacios sobrantes. split_part(…, '@', 1) toma lo que está antes de la arroba.
Error común
Así no
SELECT t.id, 'Transferencia: ' || t.note AS detalle
FROM transfers AS t;Unir con || una columna que puede ser NULL. En PostgreSQL, 'Transferencia: ' || NULL da NULL y se pierde todo el texto de la fila; en la tabla transfers de Bolsillo, 3257 de 4625 transferencias no tienen nota. concat('Transferencia: ', t.note) trata el NULL como texto vacío; también puedes escribir COALESCE(t.note, 'sin nota').
En otros motores: MySQL, BigQuery, SQL Server, Oracle
MySQL
No tiene
split_part: se usaSUBSTRING_INDEX.||es un «o» lógico, no une textos. Además, suCONCATdevuelveNULLsi algún argumento esNULL;CONCAT_WSlos salta.SUBSTRING_INDEX(email, '@', -1) -- lo que está después de la arroba CONCAT_WS(' - ', a, b) -- une y salta los NULLBigQuery
SPLITdevuelve un arreglo y se elige la parte conOFFSET, que empieza en 0. SuCONCATtambién devuelveNULLsi algún argumento esNULL.SPLIT(email, '@')[OFFSET(1)] -- dominioSQL Server
Une textos con
+, que propaga elNULL;CONCATlo trata como texto vacío. El largo se mide conLEN, que ignora los espacios finales.a + ' - ' + b -- NULL si alguno es NULL CONCAT(a, ' - ', b)Oracle
||trataNULLcomo texto vacío, al revés que PostgreSQL. Oracle además guarda el texto vacío''comoNULL.
Estos fragmentos no se ejecutan en el curso: se muestran como referencia de cada motor.