不久前,我发布了一个类似的问题,现在由于需要更新此代码,我又回头问了一个后续问题。上一个问题在这里:
Computed column based on nullable 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


现在,我使用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


在这一点上,我有点卡住了。有什么建议下一步可以尝试吗?

最佳答案

您可以使用以下模式:

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


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

10-01 18:04