SQL条件拼接问题:避免Notes为NULL时出现空括号
解决SQL中Name与Notes的条件拼接问题
嘿,我来帮你搞定这个拼接需求!你想要把Notes放在括号里和Name拼接,同时避免Notes为NULL时出现空括号,而且不想用CASE语句对吧?
问题根源分析
先看看你之前的尝试哪里出问题了:
- 第一个
concat语句:在SQL Server这类会把NULL转为空字符串的数据库里,concat('(', Notes, ')')当Notes为NULL时会变成(),所以最终结果就会出现Name2 ();如果是MySQL,这个语句会直接返回NULL,也不符合你的预期。 - 第二个
concat_ws语句:你用错了concat_ws的用法——它的第一个参数是分隔符,用来连接后面的所有元素,所以concat_ws('(', Notes, ')')会把Notes1和)用(分隔,得到Notes1(),再和Name拼接就成了Name1Notes1(),完全偏离了你的需求。
正确的解决方案
不需要CASE,用ISNULL(SQL Server)或者IFNULL(MySQL)结合concat就能搞定:
如果你用的是SQL Server
SELECT CONCAT(Name, ISNULL(' (' + Notes + ')', '')) FROM [Table];
原理:当Notes不为NULL时,' (' + Notes + ')'会生成(Notes内容),和Name拼接就得到Name1 (Notes1);当Notes为NULL时,' (' + Notes + ')'会变成NULL,ISNULL把它替换成空字符串,最终就只显示Name。
如果你用的是MySQL
SELECT CONCAT(Name, IFNULL(CONCAT(' (', Notes, ')'), '')) FROM `Table`;
原理:MySQL里CONCAT只要有一个参数是NULL就返回NULL,所以当Notes为NULL时,CONCAT(' (', Notes, ')')是NULL,IFNULL把它换成空字符串,最终只显示Name;Notes不为NULL时就正常拼接括号和内容。
这样就能完美实现你的需求:有Notes时显示Name (Notes),无Notes时只显示Name,完全不用CASE语句~
内容的提问来源于stack exchange,提问作者user3649739
相关产品推荐
相关产品推荐

