报表里姓和名分两列,导出时要合成一列姓名;地址的省市区分三个字段,要拼成一行。这种活就轮到 sql concat 出场,它是各数据库都支持的字符串拼接函数。

基础写法:SELECT CONCAT(first_name, last_name) AS full_name FROM users; 想中间加空格就多传一个参数,CONCAT(first_name, ' ', last_name)。参数可以是字段、字符串常量,也能是数字,会自动转成文本。

NULL 是最容易翻车的点

MySQL 里 CONCAT 只要有一个参数是 NULL,整串结果就是 NULL。姓名列有人没填姓,拼出来的全名直接变空。稳妥的写法是先包一层:CONCAT(IFNULL(first_name, ''), last_name)。这也是 sql concat 相关问题里问得最多的一个坑。

MySQL 还有 CONCAT_WS,第一个参数是分隔符,后面自动跳过 NULL:CONCAT_WS('-', province, city, district),空值不会多出横杠,比手动拼分隔符省心。

各家数据库的写法差异

  • MySQL 和 PostgreSQL:都支持 CONCAT 函数,PG 里还能用双竖线拼接
  • Oracle:CONCAT 一般只接两个参数,习惯用双竖线,比如 name || '-' || phone
  • SQL Server:老版本用加号拼,字段里有 NULL 会把整串变 NULL;2012 之后支持 CONCAT,参数为 NULL 时按空串处理

拼数字时留意隐式转换,浮点数可能拖出一串小数位,先 CAST 或 ROUND 再拼更干净。要拼的内容里有单引号,用两个单引号转义。

实际写报表,能上 CONCAT_WS 就不硬拼分隔符,NULL 和多余横杠两个坑一次避开,后期改起来也快。