213

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

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 AND 结果应该是

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-
4

7 回答 7

355

通过将其包装在空字符串中来转换NULLCOALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices
于 2013-04-01T10:01:32.447 回答
148

改用CONCAT_WS

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

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices
于 2013-04-01T10:03:45.773 回答
16

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。

于 2014-11-27T00:04:18.007 回答
14

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

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)
于 2015-01-05T13:04:19.323 回答
10
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices
于 2013-04-01T10:15:32.870 回答
5

原因:

MySQL :: 参考手册 :: 12.8 字符串函数和运算符说:

CONCAT()如果任何参数为NULL ,则返回NULL

解决方案:

MySQL :: 参考手册 :: 12.5 流控制功能说:

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
于 2021-04-13T21:13:36.687 回答
3

您可以使用如下 if 语句

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
于 2015-09-24T13:42:26.603 回答