MySQL CONCAT devuelve NULL si algún campo contiene NULL

163

Tengo los siguientes datos en mi tabla "dispositivos"

affiliate_name  affiliate_location  model     ip             os_type    os_version 

cs1             inter               Dell     10.125.103.25   Linux      Fedora  
cs2             inter               Dell     10.125.103.26   Linux      Fedora  
cs3             inter               Dell     10.125.103.27   NULL       NULL    
cs4             inter               Dell     10.125.103.28   NULL       NULL    

Ejecuté debajo de la consulta

SELECT CONCAT(`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) AS device_name
FROM devices

Devuelve el resultado dado a continuación

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
(NULL)
(NULL)

Cómo salir de esto para que ignore NULL Y el resultado debería ser

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
cs3-Dell-10.125.103.27-
cs4-Dell-10.125.103.28-
neeraj
fuente

Respuestas:

279

convertir los NULLvalores con una cadena vacía envolviéndola enCOALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices
John Woo
fuente
1
Puede usar if select CONCAT (if (nombre_de_filiado es nulo, '', nombre_de_filiado), '-', if (modelo es nulo '',
nombre_de_filiado
66
Para aquellos que se preguntan, como lo hice, qué hace la COALESCEfunción: devuelve el primer NULLparámetro sin valor que se le pasó (o NULLsi todos los parámetros son NULL). Al pasar una cadena vacía como segundo parámetro, está garantizando que no volverá NULL.
Jo.
3
mysql tiene IFNULL (arg, predeterminado) en su lugar COALESCE con la misma sintaxis
Vasilii Suricov
126

Use CONCAT_WS en su lugar:

CONCAT_WS () no omite cadenas vacías. Sin embargo, omite cualquier valor NULL después del argumento separador.

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices
Gurmeet
fuente
Lo siento, neeraj, me perdí el '_' entre Concat y WS. Vuelve a intentarlo con CONCAT_WS (). He actualizado la respuesta. Comprueba:
Gurmeet
8
Tenga en cuenta que esta solución oculta una "columna" completa (incluido el separador) si uno de los campos del medio es NULL. Entonces, esta respuesta solo es correcta suponiendo que solo los últimos campos pueden ser NULL. Dependiendo de su necesidad, la respuesta COALEASE () a continuación podría ser mejor.
Jannes
Esto solo funciona si desea que cada miembro esté separado por el mismo separador. CONCAT no tiene esta limitación. Publiqué la solución como respuesta aquí
patrick
12

Para tener la misma flexibilidad en CONCAT_WS que en CONCAT (si no quiere el mismo separador entre cada miembro, por ejemplo) use lo siguiente:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)
Patricio
fuente
11
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices
Harshil
fuente
15
en mysql IFNULL () en lugar de ISNULL ()
Jeffrey Nicholson Carré
10

CONCAT_WStodavía produce nulo para mí si el primer campo es Nulo. Resolví esto agregando una cadena de longitud cero al principio como en

CONCAT_WS("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`)

sin embargo

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 

produce Nulo cuando el primer campo es Nulo.

Ken4Edge
fuente
obviamente, porque el primer campo es la cadena con la que se concatenará (WS = con cadena)
Bouke Versteegh
2
CONCAT_WS es la abreviatura de Concatenar con separador. El primer parámetro es el separador y no puede ser nulo. Esto es probablemente lo que quiere en su lugar:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest
2

puede usar si la declaración como a continuación

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
Dinesh Rabara
fuente