条件CONCAT,可能为NULL或空值

时间:2011-10-13 08:50:46

标签: mysql

在下面的代码中,我通过连接地址的各个部分来创建一个地址字段。

但是,如果例如address2为空,则尾随,仍将连接到地址。

这意味着如果所有字段都为空,我的结果为,,,,

如果address1"House Number"且其他所有内容都为空,我最终会使用House Number,,,,

CONCAT( COALESCE(address1,'')   ,   ', '    , 
        COALESCE(address2,'')   ,   ', '    , 
        COALESCE(address3,'')   ,   ', '    , 
        COALESCE(city,'')       ,   ', '    , 
        COALESCE(zip, '')
) AS Address, 

只有在地址部分的内容不为空时才有条件地在地址部分之间放置逗号。

诸如(伪代码)IF(address1) is NULL use '' ELSE use ','

之类的内容

谢谢。

6 个答案:

答案 0 :(得分:38)

CONCAT_WS(', ',
        IF(LENGTH(`address1`),`address1`,NULL),
        IF(LENGTH(`address2`),`address2`,NULL),
        IF(LENGTH(`address3`),`address3`,NULL),
        IF(LENGTH(`city`),`city`,NULL),
        IF(LENGTH(`zip`),`zip`,NULL)
)

答案 1 :(得分:29)

查看CONCAT_WS功能。它完全符合您的要求。

答案 2 :(得分:10)

在这里回答:How to concat_ws multiple fields and remove duplicate separators for empty slots

这将清空空字符串以及NULL值。

CONCAT_WS(", ", NULLIF(address1, ""), NULLIF(address2, ""), NULLIF(address3, ""), NULLIF(city, ""), NULLIF(zip, ""))

答案 3 :(得分:4)

使用CONCAT_WS作为Mat说的是一个非常好的主意,但我认为我会采用不同的方式,使用凌乱的IF()语句:

CONCAT( COALESCE(address1,''), IF(LENGTH(address1), ', ', ''), 
        COALESCE(address2,''), IF(LENGTH(address2), ', ', ''), 
        COALESCE(address3,''), IF(LENGTH(address3), ', ', ''), 
        COALESCE(city,''), IF(LENGTH(city), ', ', ''), 
        COALESCE(zip,''), IF(LENGTH(address1), ', ', ''), 
) AS Address, 

IF()检查字段是否有长度,如果是,则返回逗号。否则,它返回一个空字符串。

答案 4 :(得分:3)

尝试使用MAKE_SET

SELECT MAKE_SET(11111,`address1`,`address2`,`address3`,`city`,`zip`) AS Address

它将返回一个字符串,其中所有NOT NULL值由,

分隔

答案 5 :(得分:1)

正如doc中明确提到的那样:

  

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

我们可以删除NULL 的空格,{{1}}优雅地处理它。

{{1}}