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

nee*_*raj 138 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    
Run Code Online (Sandbox Code Playgroud)

我执行下面的查询

SELECT CONCAT(`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) AS device_name
FROM devices
Run Code Online (Sandbox Code Playgroud)

它返回下面给出的结果

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
(NULL)
(NULL)
Run Code Online (Sandbox Code Playgroud)

如何摆脱这一点,以便它应该忽略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-
Run Code Online (Sandbox Code Playgroud)

Joh*_*Woo 239

通过将NULL值包装在空中来转换值COALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices
Run Code Online (Sandbox Code Playgroud)

  • mysql 有 IFNULL(arg, default) 而不是 COALESCE 具有相同的语法 (5认同)
  • 对于那些奇迹,正如我所做的那样,`COALESCE`函数做了什么:它返回传递给它的第一个非`'NULL`值参数(如果所有参数都是'NULL`,则返回'NULL`).通过传递一个空字符串作为第二个参数,您可以保证它不会返回"NULL". (4认同)

Ger*_*rry 119

请改用CONCAT_WS:

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

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果其中一个中间字段为NULL,则此解决方案会隐藏一个完整的"列"(包括分隔符).因此,只有最后一个字段可以为NULL,这个答案才是正确的.根据您的需要,下面的COALEASE()答案可能会更好. (6认同)
  • 危险:`SELECT CONCAT_WS(';',1,NULL)` 与 `SELECT CONCAT_WS(';',NULL,1)` 相同。两者都给出“1”。如果您想要“1;”或“;1”,这就是一个问题。 (2认同)

pat*_*ick 12

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

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)
Run Code Online (Sandbox Code Playgroud)


Sha*_*fin 12

原因:

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

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

解决方案:

MySQL :: 参考手册 :: 12.5 流控制函数说:

IFNULL(expr1,expr2) 
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)


小智 11

SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices
Run Code Online (Sandbox Code Playgroud)

  • 在mysql中IFNULL()而不是ISNULL() (14认同)

小智 6

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

CONCAT_WS("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`)
Run Code Online (Sandbox Code Playgroud)

然而

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 
Run Code Online (Sandbox Code Playgroud)

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

  • CONCAT_WS是Concatenate With Separator的缩写。第一个参数是分隔符,不能为null。相反,这可能是您想要的:`CONCAT_WS(“-”,affiliate_name,model,ip,os_type,os_version)。 (2认同)