如何在mysql中使用字符串连接符实现字段拼接

SQL字段内容合并技巧 常用字符串连接函数深度解析

说实话,在这个行业工作了十年,我在SQL集成方面遇到了很多障碍。
不同的数据库对NULL的处理方式不同,一不留神,结果就会爆炸。

以MySQL的CONCAT()为例。
我在处理电子商务系统时遇到了一个问题。
用户表中的姓氏、名字和中间名字段通常为 NULL。
如果直接使用 CONCAT('First', 'Middle', 'Middle') ,结果将为空。
后来发现只要MySQL参数为null,整个结果就是null。
这让我想起新运维那个男孩把SQL写成CONCAT(last_name, ',', first_name)。
结果,所有字段都是空的,整个订单什么也没有显示,客户抱怨很多。

SQLServer 好得多。
我们发了一包物流邮件,邮件1 和邮件2 经常是空的。
SQLServer 将处理一个空线程。
MATCH(address1 , ',', address2 ) 即使address1 为空,它也至少是一个带逗号的空字符串。
这个还是挺实用的,至少地址的显示不会突然中断。

最让我头疼的是PostgreSQL。
该产品需要许多 CONCAT() 参数。
如果超过两个,就会报错。
当我写活跃用户标签函数时,想使用CONCAT(tag1 ,tag2 ,tag3 ),但是系统直接崩溃了。
后来我改用PostgreSQL的||运算符,但与 COALESCE() 结合使用,'User:' || COCO(标签,“无标签”)。
说实话,这个书写系统看上去不太方便。
代码密度增加了,但易用性却直线下降。

说到原理图,我有一个经典案例。
当CRM系统恢复时,客户记录中的姓氏、名字和中间名都是空的。
当时我选择了CONCAT_WS(),使用空格分隔符,CONCAT_WS('',last_name,first_name,middle_name。
这个技巧很棒,NULL自动跳转,结果总是好的。
后来有同事坚持用COALESCE,写了一长串CONCAT(COALESCE(last_name,''),'',COALESCE(first_name,'')),说这个多了我不明白为什么要这样写多行聚合方法。
MySQL 的 GROUP_CONCAT(item_separator) 也与我比较的 Oracle 的 LISTAGG() 类似,而且 STRING_AGG 的语法很直观,所以我必须在最后修复它。
简单粗暴,比如PostgreSQL的||'Error:','Description',但是整个表达式都是用数据库自带的WHEN函数保存的,而我更喜欢用COCO('',first_name,middle_name''),那就用CONCAT_WS('') + COALESCO'吧,可惜了为什么我没有使用 REPLACE().'','') 需要两行。
年轻人对于“简单就是美”的理解还很远。
你必须没有按键处理,CONCAT_WS() 和 COALESCE() 非常安全。
在不同系统之间切换时,最烦人的就是功能的差异。
我建议新人先坚持自己平时做的事情,不要总是想着“旗舰公司”。
能够跑得好很重要。