计算列(COALESCE vs CASE vs ISNULL)

4

我之前发布过类似的问题,现在需要更新这段代码,所以回来问一个后续问题。之前的问题在这里:
基于可空列的计算列

我的数据(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

现在,我已经使用CASE组合了一个替代方案,但是对于Address1为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

我在这一点上有些困惑。你有什么建议可以尝试吗?


我的问题是:我该如何构造语句,以便在数据缺失的情况下(例如缺少Address1),FullAddress计算列不以“,”开头。 - Ed Sinek
2个回答

6

您可以使用这个模式:

SELECT
    ISNULL(Address1 + ', ', '')
    + ISNULL(Address2 + ', ', '')
    + ISNULL(City + ', ', '')
    -- ....
    AS FullAddress

NULL + ', ' 的结果是 NULL => Address1 + ', ' 将会是 NULL 或有效地址 => ISNULL(Address1 + ', ', '') 将会是空字符串或有效地址。


现在看起来很有道理——在 SQL 中将 NULL 添加到任何内容中,它仍然保持为 NULL。 - Ed Sinek
2
我不知道你的数据要求有多么“宽松”。例如,如果你只有City一列的数据,你的输出结果结尾会多出一个“, ”。也许你应该考虑使用用户定义函数。 - bfavaretto

2
SELECT STUFF(
         COALESCE(', ' + Address1, '') + COALESCE(', ' + Address2, '') + ...
         1,
         2,
         ''
       ) AS FullAddress
FROM Locations

连接的字符串可能为空,也可能以, (逗号和空格)开头。 STUFF()将删除前两个字符并返回剩余的字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接