计算栏(COALESCE vs CASE vs ISNULL)

Ed *_*nek 4 sql sql-server case coalesce calculated-columns

我不久前发布了类似的问题,现在我需要更新此代码,我回来问一个后续问题.上一个问题在这里:
基于可空列的计算列

我的数据(Address1, Address2, City, State, Zip, Country)可能包含不完整的信息.即我不能保证除了StateCountry列之外的任何东西都有数据.

我想有一个计算列FullAddress.

以前,我使用过COALESCE,如果填写了所有字段,那么效果很好.现在,随着数据要求的放宽,这已不再是一个选项(因为我们以重复的逗号结尾FullAddress).这是我以前使用的(注意,我只是在这里使用SELECT语句以方便使用 - 一旦我有适用于所有情况的东西,将转换为计算列"alter table add"语句):

SELECT (((((COALESCE([Address1],'')
    + COALESCE(', '+[Address2],''))
    + COALESCE(', '+[City],''))
    + COALESCE(', '+[State],''))
    + COALESCE(', '+[Zip],''))
    + COALESCE(', '+[Country],'')) AS FullAddress
FROM Locations
Run Code Online (Sandbox Code Playgroud)

现在,我已经使用了一个替代方法CASE,但它仍然不适用于边缘情况Address1 is NULL(问题是FullAddress它将具有','作为前两个字符)

SELECT CASE WHEN [Address1] IS NOT NULL THEN [Address1] ELSE '' END
        + CASE WHEN [Address2] IS NOT NULL THEN ', ' + [Address2] ELSE '' END
        + CASE WHEN [City] IS NOT NULL THEN ', ' + [City] ELSE '' END
        + CASE WHEN [State] IS NOT NULL THEN ', ' + [State] ELSE '' END
        + CASE WHEN [Zip] IS NOT NULL THEN ', ' + [Zip] ELSE '' END
        + CASE WHEN [Country] IS NOT NULL THEN ', ' + [Country] ELSE '' END
        AS [FullAddress]
FROM Locations
Run Code Online (Sandbox Code Playgroud)

我现在有点卡住了.任何建议接下来要尝试什么?

TcK*_*cKs 6

你可以使用这种模式:

SELECT
    ISNULL(Address1 + ', ', '')
    + ISNULL(Address2 + ', ', '')
    + ISNULL(City + ', ', '')
    -- ....
    AS FullAddress
Run Code Online (Sandbox Code Playgroud)

concation的结果NULL + ', 'NULL=> Address1 + ', '将为NULL或有效地址=> ISNULL(Address1 + ', ', '')将为空字符串或有效地址.

  • 我不知道你的数据要求是多么"放松".例如,如果你只有列'City`的数据,你的输出最后会有一个额外的`,`.也许您应该考虑使用用户定义函数. (2认同)