Tema SQL
CONCAT_WS() (MySQL / MariaDB)
Concatena argumentos usando un separador fijo, ignorando NULL en los valores a unir (a diferencia de CONCAT que devuelve NULL si algún argumento es NULL).
Descripción
CONCAT_WS(separador, s1, s2, …) inserta el separador solo entre valores no NULL omitidos de la lista; si todos los valores opcionales son NULL, el resultado puede ser cadena vacía o NULL según versión y lista. El separador en sí no se ignora: si es NULL, el resultado entero suele ser NULL. Ideal para montar direcciones, etiquetas compuestas o exportaciones CSV sin comas sobrantes. CONCAT estándar en MySQL también existe; CONCAT_WS es más tolerante a datos incompletos en columnas opcionales. Para concatenar muchas filas de un grupo usa GROUP_CONCAT, no CONCAT_WS agregando filas manualmente.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
CONCAT_WS(separador, cadena1 [, cadena2 ...])
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- NULL en valores
- Se omiten sin anular todo el resultado (salvo el separador NULL).
- CONCAT vs CONCAT_WS
- CONCAT devuelve NULL si cualquier argumento es NULL.
- Tipos
- Convierte números a cadena implícitamente en la concatenación.
Ejemplos
Ejemplo 1
SELECT CONCAT_WS('-', '2026', '04', '12') AS iso;
SELECT CONCAT_WS(', ', calle, NULLIF(numero, ''), ciudad) AS direccion
FROM clientes;
Ejemplo 2
SELECT CONCAT_WS(' · ', titulo, NULL, subtitulo) AS linea
FROM publicaciones;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.