如果任何字段包含NULL,MySQL CONCAT将返回NULL

我有我的表“设备”中的以下数据:

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 

我执行下面的查询

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

它返回下面给出的结果

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

如何走出这个,所以它应该忽略NULL和结果应该是

 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- 

通过将其包装在COALESCENULL值转换为空string

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

改用CONCAT_WS :

CONCAT_WS()不会跳过空string。 但是,它会在分隔符参数后面跳过任何空值。

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

要在CONCAT_WS中具有与CONCAT相同的灵活性(如果不希望每个成员之间使用相同的分隔符),请使用以下命令:

 SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc) 

如果第一个字段为Null,CONCAT_WS仍会为我生成空值。 我通过在CONCAT_WS(“”, affiliate_name ,' – ', model ,' – ', ip ,' – ', os_version ,' – ', os_version )中添加一个零长度的string来解决这个问题。 , affiliate_name ,' – ', model ,' – ', ip ,' – ', os_version ,' – ', os_version )在第一个字段为Null时产生Null。

你可以使用if语句如下

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