mysql字符串拼接函数:concat和concat_ws

时间:2025-03-17 09:02:25

concat函数

CONCAT(str1,str2,…)

在使用concat遇到了这样的一个问题,在更新用户收货地址id的时候:

update t_user tu set user_addr_id = (
    select 
    id 
    from t_addr ta
    where
    concat(, , )
    =
    concat(, , )
    and user_id=xxx
)

只要province,city,county其中有一个字段属性为NULL值的时候,where之后的过滤条件就变成了null=null,这是不科学的,并不是我想要的结果,原来在使用concat函数的时候, 只要其中一个字段属性有NULL值,concat结果就是NULL。

//有一个字段为NULL
mysql> SELECT concat(1,'22','你好',NULL) display_name;
+--------------+
| display_name |
+--------------+
| NULL         |
+--------------+

//有一个字段为''
mysql> SELECT concat(1,'22','你好','') display_name;
+--------------+
| display_name |
+--------------+
| 122你好      |
+--------------+
1 row in set (0.00 sec)

//不为null''
mysql> SELECT concat(1,'22','你好') display_name;
+--------------+
| display_name |
+--------------+
| 122你好      |
+--------------+
1 row in set (0.00 sec)

concat_ws函数

CONCAT_WS(separator,str1,str2,…), 表示concat with separator,即有分隔符的字符串拼接函数

//有一个字段为NULL
mysql> SELECT concat_ws('-',1,'22','你好',null) display_name;
+--------------+
| display_name |
+--------------+
| 1-22-你好    |
+--------------+
1 row in set (0.01 sec)

//有一个字段为''
mysql> SELECT concat_ws('-',1,'22','你好','') display_name;
+--------------+
| display_name |
+--------------+
| 1-22-你好-   |
+--------------+
1 row in set (0.00 sec)

//不为null''
mysql> SELECT concat_ws('-',1,'22','你好') display_name;
+--------------+
| display_name |
+--------------+
| 1-22-你好    |
+--------------+
1 row in set (0.00 sec)

因此,在更新用户收货地址id的时候,只需要将concat函数换成concat_ws函数即可