CONCAT_WS

CONCAT_WS significa "Concat With Separator", concatenar con separador. Une varias cadenas intercalando entre ellas un separador que indicas una sola vez, y tiene una ventaja decisiva sobre CONCAT: ignora los valores NULL en lugar de propagarlos.

Estas dos características la hacen ideal para construir listas, direcciones, líneas CSV o nombres completos a partir de columnas que pueden estar vacías. Donde CONCAT te obliga a repetir el separador entre cada par de valores y a protegerte de los nulos uno por uno, CONCAT_WS resuelve ambos problemas de golpe. En este artículo veremos su sintaxis, su comportamiento con NULL (y un matiz importante con la cadena vacía), y sus usos más habituales.

Sintaxis

El primer argumento de CONCAT_WS es siempre el separador; el resto son las cadenas que se van a unir.

CONCAT_WS(separador, cadena1, cadena2, ..., cadenaN)

Sus reglas de comportamiento son:

  • El primer argumento es el separador, que se intercala entre los valores
  • Si el separador es NULL, el resultado completo es NULL
  • Los argumentos NULL se ignoran, no producen un resultado NULL

Ejemplo básico

En su uso normal, une los valores colocando el separador entre cada par. El separador no aparece ni antes del primer valor ni después del último:

SELECT CONCAT_WS(', ', 'Manzana', 'Naranja', 'Plátano') AS frutas;
frutas
Manzana, Naranja, Plátano

El separador puede ser cualquier texto, no solo un carácter, lo que permite componer títulos o rutas con comodidad:

SELECT CONCAT_WS(' - ', 'MySQL', 'Tutorial', 'Español') AS titulo;
titulo
MySQL - Tutorial - Español

CONCAT_WS ignora NULL

Esta es su ventaja principal y la razón por la que muchas veces se prefiere a CONCAT. Mientras que CONCAT devuelve NULL en cuanto un argumento lo es, CONCAT_WS simplemente lo salta y une el resto:

-- CONCAT: un solo NULL contamina todo el resultado
SELECT CONCAT('A', NULL, 'B') AS con_concat;
con_concat
NULL

Con CONCAT_WS, el valor nulo desaparece y no deja ni siquiera un separador de más:

-- CONCAT_WS: ignora los NULL
SELECT CONCAT_WS(', ', 'A', NULL, 'B') AS con_concat_ws;
con_concat_ws
A, B

Conviene saber, eso sí, que esta regla solo afecta a NULL. Una cadena vacía ('') no se ignora: cuenta como un valor más y genera un separador a su alrededor. Por eso, si tus columnas usan cadenas vacías en lugar de NULL para los datos ausentes, CONCAT_WS no las eliminará y aparecerán separadores duplicados.

Datos de clientes

Componer el nombre completo es un caso donde CONCAT_WS brilla, porque si algún cliente no tuviera apellidos, el resultado no se rompería:

SELECT CONCAT_WS(' ', nombre, apellidos) AS nombre_completo
FROM clientes
LIMIT 5;
nombre_completo
María García López
Carlos Rodríguez Martín
Laura López Sánchez
Pedro Fernández Castro
Ana Martínez Ruiz

Construir líneas de contacto

Unir varios datos de contacto en una sola línea legible es directo, y de nuevo cualquier campo nulo se omite sin dejar rastro:

SELECT CONCAT_WS(', ', nombre, email, telefono) AS contacto
FROM clientes
LIMIT 3;
contacto
María, maria.garcia@email.com, 612345678
Carlos, carlos.rodriguez@email.com, 623456789
Laura, laura.lopez@email.com, 634567890

Separadores variados

El separador puede ser cualquier cosa, lo que da mucha flexibilidad para distintos formatos de presentación en una misma consulta:

SELECT
    CONCAT_WS(' | ', nombre, precio, stock) AS con_pipe,
    CONCAT_WS(' / ', nombre, precio) AS con_slash,
    CONCAT_WS(' → ', nombre, precio) AS con_flecha
FROM productos
WHERE id = 1;
con_pipecon_slashcon_flecha
iPhone 15 Pro | 1299.99 | 50iPhone 15 Pro / 1299.99iPhone 15 Pro → 1299.99

Generar CSV

Uno de los usos más prácticos es exportar filas en formato CSV: con la coma como separador, cada fila se convierte en una línea lista para un archivo. Combinado con un SELECT sobre la tabla:

SELECT CONCAT_WS(',', id, nombre, precio, stock) AS linea_csv
FROM productos
LIMIT 3;
linea_csv
1,iPhone 15 Pro,1299.99,50
2,MacBook Air M2,1199.99,30
3,AirPods Pro,249.99,100

Para un CSV real habría que tener cuidado con los valores que contengan la propia coma, que deberían entrecomillarse, pero para datos sencillos esta técnica es muy cómoda.

CONCAT_WS vs CONCAT

La siguiente tabla resume cuándo conviene cada una de las dos funciones de concatenación:

CaracterísticaCONCATCONCAT_WS
SeparadorManual (incluir como argumento)Primer argumento, intercalado
Comportamiento con NULLDevuelve NULLIgnora el NULL
Uso idealConcatenación simple sin separador fijoListas con separador común

Errores comunes

El malentendido más frecuente es creer que CONCAT_WS también ignora las cadenas vacías. Solo descarta NULL; un valor '' sí se concatena y produce separadores a su alrededor, lo que da resultados como A,,B. Si trabajas con cadenas vacías, conviene convertirlas a NULL con NULLIF antes de pasarlas.

El otro descuido es pasar un separador NULL (a veces de forma indirecta, desde una variable). En ese caso, a diferencia del resto de argumentos, el resultado completo es NULL, porque sin separador la función no puede operar.

Cuándo usar CONCAT_WS

CONCAT_WS es la elección idónea siempre que unas varios valores con un mismo separador y quieras que los nulos se omitan limpiamente: nombres completos, listas, datos de contacto o líneas CSV. Cuando no haya un separador fijo o necesites controlar exactamente qué ocurre con cada valor, CONCAT ofrece un control más manual.

En el siguiente artículo veremos LENGTH, que devuelve la longitud de una cadena en bytes.

Escrito por Eduardo Lázaro