Funciones de texto: construir, localizar y normalizar cadenas
Los textos suelen llegar con mayúsculas diferentes, espacios adicionales o fragmentos que necesitamos localizar. SQL Server incluye funciones para combinar, extraer, buscar, reemplazar y normalizar cadenas sin salir de la consulta.
Cada función resuelve una operación pequeña. La parte importante es distinguir una transformación de presentación de una corrección permanente de datos.
Operaciones de texto
CONCAT: reunir valores en una cadena
CONCAT recibe dos o más argumentos y los reúne de izquierda a derecha. Un argumento es cada valor que entregamos a la función: puede ser un texto, una columna, un número o el resultado de otra expresión.
La función convierte los argumentos a texto y trata cada valor NULL como una cadena vacía. Esto permite construir una descripción sin que un dato ausente vuelva nulo el resultado completo.
CONCAT(Expresion1, Expresion2, ...)
TRIM: retirar espacios de los extremos
TRIM devuelve una cadena sin los espacios situados antes del primer carácter y después del último. No retira los espacios que forman parte del texto interior ni modifica el valor almacenado en la tabla.
TRIM(Expresion)
UPPER y LOWER: cambiar mayúsculas y minúsculas
UPPER convierte las letras de una expresión a mayúsculas; LOWER las convierte a minúsculas. Ambas funciones cambian la representación devuelta por la consulta, pero no corrigen por sí solas diferencias de contenido ni validan que un texto tenga el formato esperado.
UPPER(Expresion)
LOWER(Expresion)
CHARINDEX: localizar una cadena
CHARINDEX busca una cadena dentro de otra y devuelve la posición donde comienza la primera coincidencia. Las posiciones se cuentan desde 1; si no encuentra el texto, devuelve 0.
CHARINDEX(TextoBuscado, Expresion)
SUBSTRING: extraer desde una posición
SUBSTRING devuelve una parte de la expresión. La posición inicial indica el primer carácter que se conserva y la longitud indica cuántos caracteres se solicitan a partir de ese punto.
SUBSTRING(Expresion, PosicionInicial, Longitud)
REPLACE: sustituir coincidencias
REPLACE busca un fragmento dentro de una expresión y sustituye todas sus coincidencias por un texto nuevo. El resultado es otra cadena; la función no actualiza la columna de origen.
REPLACE(Expresion, TextoBuscado, TextoNuevo)
LEN y DATALENGTH: medir caracteres o bytes
LEN devuelve la cantidad de caracteres de una expresión sin contar los espacios finales. DATALENGTH mide los bytes utilizados para almacenarla. Un byte es una unidad de almacenamiento, por lo que ambas funciones pueden devolver valores distintos para el mismo texto.
LEN(Expresion)
DATALENGTH(Expresion)
Ejemplo: construir una descripción
CONVERT(VARCHAR(20), p.Precio) transforma el número en texto antes de incorporarlo a la descripción. El primer argumento fija el tipo y la longitud del resultado; el segundo contiene el valor que se convierte.
SELECT
p.IdProducto,
CONCAT(
p.Nombre,
N' - $',
CONVERT(VARCHAR(20), p.Precio)
) AS Descripcion
FROM dbo.Producto AS p;
La conversión permite reunir el nombre y el precio en una sola cadena. Para formatos numéricos destinados al usuario final suele ser mejor que la aplicación se encargue de moneda y cultura.
Limpiar espacios y unificar comparación visual
SELECT
c.IdCliente,
TRIM(c.TelefonoMovil) AS TelefonoLimpio,
LOWER(TRIM(c.Correo)) AS CorreoNormalizado
FROM dbo.Cliente AS c;
La consulta transforma el resultado; no modifica los valores almacenados. Para corregir la tabla necesitamos un UPDATE deliberado y una validación previa.
Localizar y extraer una parte
Podemos separar el dominio de un correo buscando primero el carácter @:
SELECT
c.Correo,
CASE
WHEN CHARINDEX('@', c.Correo) > 0 THEN
SUBSTRING(
c.Correo,
CHARINDEX('@', c.Correo) + 1,
LEN(c.Correo)
)
ELSE NULL
END AS Dominio
FROM dbo.Cliente AS c;
La condición evita asumir que todos los valores contienen el separador. Este ejemplo ayuda a explorar datos, pero no sustituye una validación completa de direcciones de correo.
Reemplazar fragmentos
SELECT REPLACE(N'Pedido pendiente', N'pendiente', N'confirmado') AS TextoNuevo;
REPLACE sustituye todas las coincidencias que reconoce la intercalación utilizada. La intercalación es el conjunto de reglas con que SQL Server compara y ordena texto; de ella depende la sensibilidad a mayúsculas y acentos.
Texto Unicode y longitudes
El prefijo N crea literales Unicode, una codificación capaz de representar caracteres de numerosos sistemas de escritura; por ejemplo, N'México'. Conviene utilizarlo cuando el destino es NVARCHAR y el texto puede contener caracteres fuera de la página de códigos de VARCHAR, el conjunto limitado de caracteres asociado a esa codificación.
Al comparar LEN y DATALENGTH podemos distinguir la longitud visible del espacio utilizado. La diferencia resulta útil al investigar almacenamiento y espacios aparentemente invisibles.
Qué conviene comprobar
Aplicar UPPER, LOWER, TRIM u otra función directamente sobre una columna filtrada puede dificultar el uso de un índice, una estructura que organiza valores para facilitar el acceso a filas. Si la búsqueda normalizada es frecuente, debemos revisar intercalación, calidad del dato o una estrategia de almacenamiento adecuada.
También debemos conocer el tipo y la longitud resultante al concatenar. Los resultados muy extensos pueden truncarse si ninguna expresión promueve el cálculo a un tipo de longitud máxima.