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

时间:2013-04-01 09:59:52

标签: mysql sql null concat

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

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-

7 个答案:

答案 0 :(得分:213)

NULL值用空字符串转换为COALESCE

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

答案 1 :(得分:109)

改为使用CONCAT_WS

  

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

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

答案 2 :(得分:11)

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

答案 3 :(得分:10)

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

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

答案 4 :(得分:4)

如果第一个字段为Null,

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

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

然而

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 
当第一个字段为空时,

产生Null。

答案 5 :(得分:2)

您可以使用if语句,如下所示

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

答案 6 :(得分:2)

原因:

<块引用>

MySQL :: Reference Manual :: 12.8 String Functions and Operators 说:

如果任何参数为 NULL

CONCAT() 返回 NULL

解决方案:

<块引用>

MySQL :: Reference Manual :: 12.5 Flow Control Functions 说:

IFNULL(expr1,expr2) 

如果expr1不是NULLIFNULL()返回expr1;否则返回 expr2。

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