能否用SELECT语句将4列地址合并为2列并用于SQL Server视图?
解决方案:SQL Server SELECT语句实现地址字段映射(用于视图)
完全可以通过纯SELECT语句实现需求,无需函数或存储过程,以下是针对不同SQL Server版本的实现方案,均直接用于视图创建:
SQL Server 2017及以上版本(推荐)
利用CONCAT_WS函数自动忽略空值、拼接非空字段,写法简洁:
SELECT -- 目标ADDRLine1:原ADDRLine3/4非空时,合并原ADDRLine1+ADDRLine2;否则直接取原ADDRLine1 CASE WHEN ADDRLine3 IS NOT NULL OR ADDRLine4 IS NOT NULL THEN CONCAT_WS(', ', ADDRLine1, ADDRLine2) ELSE ADDRLine1 END AS ADDRLine1, -- 目标ADDRLine2:原ADDRLine3/4非空时,合并原ADDRLine3+ADDRLine4;否则直接取原ADDRLine2 CASE WHEN ADDRLine3 IS NOT NULL OR ADDRLine4 IS NOT NULL THEN CONCAT_WS(', ', ADDRLine3, ADDRLine4) ELSE ADDRLine2 END AS ADDRLine2, -- 直接映射其余字段 ADDRCity, ADDRCounty, ADDRPostcode FROM 原数据库.dbo.原地址表;
逻辑说明
CONCAT_WS(', ', ...)会用,作为分隔符拼接所有非空字段,自动跳过空值,避免出现多余的逗号(比如原ADDRLine2为空时,只会输出原ADDRLine1)- 外层CASE判断原表是否存在ADDRLine3/4的非空值:
- 存在时:按规则合并前两行到目标第一字段,后两行到目标第二字段
- 不存在时:直接映射原ADDRLine1/2到目标对应字段
SQL Server 2016及以下版本(兼容写法)
低版本无CONCAT_WS,用CONCAT+CASE手动处理空值拼接:
SELECT CASE WHEN ADDRLine3 IS NOT NULL OR ADDRLine4 IS NOT NULL THEN CONCAT( ADDRLine1, CASE WHEN ADDRLine2 IS NOT NULL THEN ', ' + ADDRLine2 ELSE '' END ) ELSE ADDRLine1 END AS ADDRLine1, CASE WHEN ADDRLine3 IS NOT NULL OR ADDRLine4 IS NOT NULL THEN CONCAT( ADDRLine3, CASE WHEN ADDRLine4 IS NOT NULL THEN ', ' + ADDRLine4 ELSE '' END ) ELSE ADDRLine2 END AS ADDRLine2, ADDRCity, ADDRCounty, ADDRPostcode FROM 原数据库.dbo.原地址表;
逻辑说明
- 通过嵌套
CASE判断后续字段是否非空,仅当非空时才添加分隔符和字段值,避免出现无效的, - 核心逻辑与高版本一致,确保符合所有映射规则
用于创建视图
将上述SELECT语句直接嵌入CREATE VIEW即可:
CREATE VIEW 目标数据库.dbo.地址映射视图 AS -- 这里替换为上述对应版本的SELECT语句 SELECT CASE WHEN ADDRLine3 IS NOT NULL OR ADDRLine4 IS NOT NULL THEN CONCAT_WS(', ', ADDRLine1, ADDRLine2) ELSE ADDRLine1 END AS ADDRLine1, CASE WHEN ADDRLine3 IS NOT NULL OR ADDRLine4 IS NOT NULL THEN CONCAT_WS(', ', ADDRLine3, ADDRLine4) ELSE ADDRLine2 END AS ADDRLine2, ADDRCity, ADDRCounty, ADDRPostcode FROM 原数据库.dbo.原地址表;
内容的提问来源于stack exchange,提问作者arresteddevelopment
相关产品推荐
相关产品推荐

