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


162

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

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-

Answers:


278

NULL通过将其包装在空字符串中来转换值COALESCE

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

1
您可以使用从设备中选择CONCAT(if(aff()的名称为null,'',affiliate_name),“-”,if(model的为null”,“ affiliate_name))作为设备的模型
Dinesh Rabara 2015年

6
和我一样,对于那些奇迹,COALESCE函数是做什么的:它返回NULL传递给它的第一个非值参数(或者NULL如果所有参数都是NULL)。通过传递空字符串作为第二个参数,可以保证它不会返回NULL

3
mysql具有相同语法的IFNULL(arg,默认值)代替COALESCE
Vasilii Suricov

126

改用CONCAT_WS

CONCAT_WS()不会跳过空字符串。但是,它会跳过分隔符参数之后的所有NULL值。

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

抱歉,我错过了Concat和WS之间的'_',请再次使用CONCAT_WS()。我已经更新了答案,请检查,
Gurmeet

8
请注意,如果中间字段之一为NULL,则此解决方案将隐藏完整的“列”(包括分隔符)。因此,仅在最后一个字段可以为NULL的情况下,此答案才是正确的。根据您的需要,下面的COALEASE()答案可能会更好。
Jannes 2014年

仅当您希望每个成员都由相同的分隔符分隔时,此方法才有效。CONCAT没有此限制。我将解决方案作为答案发布在这里
patrick

12

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

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

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

15
在mysql IFNULL()而不是ISNULL()中
Jeffrey NicholsonCarré

10

CONCAT_WS如果第一个字段为Null,仍然为我产生null。我通过在开头添加零长度的字符串来解决此问题,如下所示

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

然而

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

当第一个字段为Null时产生Null。


显然,因为第一个字段是将与之连接的字符串(WS =带字符串)
Bouke Versteegh 2015年

2
CONCAT_WS是Concatenate With Separator的缩写。第一个参数是分隔符,不能为null。这可能是你想要什么,而不是:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.