You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:05:12