SQL中CONCAT与CONCAT_WS的区别及使用疑惑解析
SQL中CONCAT与CONCAT_WS的拼接逻辑解析
先明确两个函数的核心行为:
CONCAT:无分隔符直接拼接
CONCAT() 的逻辑非常直白——把传入的所有字符串参数按顺序直接拼接,没有任何额外字符插入。
比如:
CONCAT('Google', '.com')→ 直接把'Google'和'.com'连起来,得到Google.comCONCAT('.', 'www', 'google', 'com')→ 把'.'、'www'、'google'、'com'依次拼接,得到.wwwgooglecom(这就是你误以为CONCAT_WS会生成的结果,但这是CONCAT的行为)
CONCAT_WS:带分隔符的智能拼接
CONCAT_WS() 是 With Separator 的缩写,专门用来做「用指定分隔符连接多个字符串」的操作,核心规则:
- 第一个参数是分隔符,后面的参数是要拼接的目标字符串
- 只会在非NULL的目标字符串之间插入分隔符,不会在开头/结尾添加分隔符
- 如果某个目标字符串是NULL,会直接忽略该参数,不会产生连续的分隔符
回到你的问题:CONCAT_WS('.', 'www', 'google', 'com') 的执行过程是:
- 分隔符是
. - 要拼接的三个字符串是
www、google、com - 函数在这三个字符串之间插入
.,也就是www+.+google+.+com - 最终结果是
www.google.com(你描述里的Google .com应该是笔误)
你误以为会生成.wwwgooglecom,是把CONCAT_WS的逻辑搞反了——它不会把分隔符放在最前面,也不会把所有字符串直接堆在一起,而是严格在每两个目标字符串之间插入分隔符。
再补几个例子帮你理解:
CONCAT_WS('-', 'a', 'b', NULL, 'c')→ 忽略NULL,得到a-b-cCONCAT_WS(' ', 'Hello', 'World')→ 得到Hello World
内容的提问来源于stack exchange,提问作者Erin Evergreen
相关产品推荐
相关产品推荐

