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.

Funciones principales

Función Uso
CONCAT Une valores y trata los nulos como cadenas vacías
SUBSTRING Extrae una parte desde una posición y longitud
CHARINDEX Devuelve la posición de un texto dentro de otro
REPLACE Sustituye todas las apariciones de una cadena
TRIM Retira espacios al inicio y al final
UPPER y LOWER Cambian el uso de mayúsculas y minúsculas

Ejemplo: construir una descripción

SELECT
    p.IdProducto,
    CONCAT(
        p.Nombre,
        N' - $',
        CONVERT(VARCHAR(20), p.Precio)
    ) AS Descripcion
FROM dbo.Producto AS p;

CONCAT convierte sus argumentos a texto y no vuelve nulo todo el resultado cuando uno de ellos es NULL. 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 sensibilidad a mayúsculas y acentos depende de esa configuración.

Texto Unicode y longitudes

El prefijo N crea literales Unicode, 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.

LEN no cuenta espacios finales. DATALENGTH devuelve bytes, no caracteres. Esa diferencia importa al diagnosticar longitudes, 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. 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.

Relacionado con

  • COALESCE y NULLIF: distinguen valores nulos, vacíos y alternativos.
  • Conversiones: controlan cómo se incorporan números y fechas a una cadena.
  • LIKE: busca patrones sin extraer una posición.
  • STRING_AGG y STRING_SPLIT: combinan varias filas o dividen listas.