使用IIF与Is Null组合时出错:多地址列合并为完整地址问题
解决SQL地址拼接的语法错误与NULL值问题
我来帮你捋捋这个问题哈~你遇到的红色波浪线问题,大概率是数据库方言不支持IIF函数导致的(比如MySQL、Oracle就没有IIF),编辑器可能误把Is也标红了,当然也可能是编辑器的语法检测小bug。另外你原来的语句还有个隐藏问题:如果AddressLine3是NULL,整个拼接结果会直接变成NULL,因为NULL和任何字符串拼接都会返回NULL,这个也得一起修复。
下面给你分不同数据库场景的解决方案:
如果你用的是SQL Server/Access/PostgreSQL(支持IIF的数据库)
虽然IS NULL的写法本身是对的,但用标准SQL的CASE WHEN兼容性更强,还能避免编辑器的语法误判,同时修复NULL拼接的问题:
SELECT CASE WHEN add1.AddressLine1 IS NOT NULL THEN add1.AddressLine1 + CHAR(13) ELSE '' END + CASE WHEN add1.AddressLine2 IS NOT NULL THEN add1.AddressLine2 + CHAR(13) ELSE '' END + COALESCE(add1.AddressLine3, '') AS EntireAddress FROM T_Address add1
或者用更简洁的COALESCE写法(推荐,代码更短):
SELECT COALESCE(add1.AddressLine1 + CHAR(13), '') + COALESCE(add1.AddressLine2 + CHAR(13), '') + COALESCE(add1.AddressLine3, '') AS EntireAddress FROM T_Address add1
COALESCE的作用是返回第一个非NULL的值,这样就把NULL列转成空字符串,避免整个结果变NULL。
如果你用的是MySQL
MySQL不支持IIF,得换成IF函数,同时用IFNULL或者COALESCE处理NULL:
SELECT IF(add1.AddressLine1 IS NULL, '', add1.AddressLine1 + CHAR(13)) + IF(add1.AddressLine2 IS NULL, '', add1.AddressLine2 + CHAR(13)) + IFNULL(add1.AddressLine3, '') AS EntireAddress FROM T_Address add1
同样,也可以用COALESCE简化:
SELECT COALESCE(add1.AddressLine1 + CHAR(13), '') + COALESCE(add1.AddressLine2 + CHAR(13), '') + COALESCE(add1.AddressLine3, '') AS EntireAddress FROM T_Address add1
如果你用的是Oracle
Oracle既没有IIF,字符串拼接也得用||替代+,同时用NVL处理NULL:
SELECT NVL(add1.AddressLine1 || CHR(13), '') || NVL(add1.AddressLine2 || CHR(13), '') || NVL(add1.AddressLine3, '') AS EntireAddress FROM T_Address add1
另外补充一句:你原来语句里的CHAR(13)是回车符,如果需要Windows风格的换行(回车+换行),可以改成CHAR(13)+CHAR(10)(SQL Server/MySQL)或者CHR(13)||CHR(10)(Oracle)。
内容的提问来源于stack exchange,提问作者Cooz
相关产品推荐
相关产品推荐

