在“设备”表中有以下数据

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-

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

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

使用CONCAT_WS代替:

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

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

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

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

然而

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

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


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

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

你可以像下面这样使用if语句

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

原因:

MySQL::参考手册::12.8字符串函数和操作符说明: CONCAT()如果任何参数为NULL则返回NULL。

解决方案:

MySQL::参考手册::12.5流控制函数说: IFNULL (expr1 expr2) 如果expr1不是NULL, IFNULL()返回expr1;否则返回expr2。

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