如何创建排除空列并添加换行符的完整地址计算列?
实现地址字段非空拼接并添加换行的计算列
当然可以实现,核心思路是逐个处理每个字段,非空则拼接字段值+换行符,空则拼接空字符串,避免因为NULL导致整个拼接结果变为NULL。以下是几种可行的方案(以SQL Server为例):
方案1:使用ISNULL逐个拼接
针对每个字段,用ISNULL判断:如果字段非空,就拼接字段值+换行符;如果为空,就拼接空字符串。最后加上必不为空的PostCode(如需最后也加换行,可追加对应的字符):
ALTER TABLE 你的表名 ADD FullAddress AS ISNULL(Address1 + CHAR(10) + CHAR(13), '') + ISNULL(Address2 + CHAR(10) + CHAR(13), '') + ISNULL(Address3 + CHAR(10) + CHAR(13), '') + ISNULL(Address4 + CHAR(10) + CHAR(13), '') + ISNULL(City + CHAR(10) + CHAR(13), '') + ISNULL(County + CHAR(10) + CHAR(13), '') + PostCode + CHAR(10) + CHAR(13)
如果不需要PostCode后面的换行,直接去掉最后的+ CHAR(10) + CHAR(13)即可。
方案2:用CONCAT_WS简化写法
CONCAT_WS函数会自动忽略NULL值,用指定的分隔符连接所有非空字段,非常适合这个场景:
ALTER TABLE 你的表名 ADD FullAddress AS CONCAT_WS(CHAR(10) + CHAR(13), Address1, Address2, Address3, Address4, City, County, PostCode)
这个写法的效果是非空字段之间用换行符分隔,最后一个字段后不会加额外换行。如果需要最后也加换行,直接在末尾拼接即可:
ALTER TABLE 你的表名 ADD FullAddress AS CONCAT_WS(CHAR(10) + CHAR(13), Address1, Address2, Address3, Address4, City, County, PostCode) + CHAR(10) + CHAR(13)
为什么你之前的方法失效?
COALESCE是返回第一个非空值,不是拼接所有非空字段,所以不符合需求;- 用
CASE WHEN时如果直接返回NULL,字符串拼接中只要有一个NULL,整个结果就会变成NULL。解决办法是把CASE的ELSE分支设为空字符串,而不是NULL,比如CASE WHEN Address2 IS NOT NULL THEN Address2 + CHAR(10)+CHAR(13) ELSE '' END,再把所有CASE结果加起来,就不会出现NULL问题。
内容的提问来源于stack exchange,提问作者Reg J
相关产品推荐
相关产品推荐

