MySQL CONCAT devuelve NULL si cualquier campo contiene NULL


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é la siguiente 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 se debe ignorar NULL Y el resultado debe 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-
Author: John Woo, 2013-04-01

6 answers

Convierta los valores NULL con una cadena vacía envolviéndola en COALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices
 181
Author: John Woo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-01 10:01:32

Use CONCAT_WS en su lugar:

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

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices
 100
Author: Gerry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-30 17:13:01
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices
 10
Author: Harshil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-01 10:15:32

Para tener la misma flexibilidad en CONCAT_WS que en CONCAT (si no desea el mismo separador entre todos los miembros, por ejemplo) use lo siguiente:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)
 5
Author: patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-05 13:04:19

CONCAT_WS todavía produce null para mí si el primer campo es Null. Lo resuelto por la adición de una cadena de longitud cero en el inicio como en CONCAT_WS("",affiliate_name,'-',model,'-',ip,'-',os_type,'-',os_version) sin embargo CONCAT("",affiliate_name,'-',model,'-',ip,'-',os_type,'-',os_version) produce Null cuando el primer campo es Nulo.

 2
Author: Ken4Edge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-27 00:04:18

Puede usar la declaración if como la siguiente

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
 1
Author: DNS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-24 13:42:26