计算栏(COALESCE vs CASE vs ISNULL)

时间:2012-01-08 02:50:00

标签: sql sql-server case coalesce calculated-columns

我前一段时间发布了一个类似的问题,现在我需要更新此代码,我回来问一个后续问题。以前的问题在这里:
Computed column based on nullable columns

我的数据(Address1, Address2, City, State, Zip, Country)可能包含不完整的信息。即我无法保证StateCountry列以外的任何内容都有数据。

我希望FullAddress有一个计算列。

以前,我使用了COALESCE,如果填写了所有字段,效果很好。现在,由于数据要求已经放宽,这不再是一个选项(因为我们在{{ 1}})。以下是我以前使用的(注意,我只是在这里使用SELECT语句以便于使用 - 一旦我有适用于所有情况的东西,将转换为计算列“alter table add”语句< / em>的):

FullAddress

现在,我已经使用SELECT (((((COALESCE([Address1],'') + COALESCE(', '+[Address2],'')) + COALESCE(', '+[City],'')) + COALESCE(', '+[State],'')) + COALESCE(', '+[Zip],'')) + COALESCE(', '+[Country],'')) AS FullAddress FROM Locations 整理了一个替代方案,但它仍然不适用于CASE的边缘情况(问题是Address1 is NULL会有', '作为前两个字符)

FullAddress

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

2 个答案:

答案 0 :(得分:6)

你可以使用这种模式:

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

合并NULL + ', '的结果是NULL =&gt; Address1 + ', '将为NULL或有效地址=&gt; ISNULL(Address1 + ', ', '')将为空字符串或有效地址。

答案 1 :(得分:2)

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

连接的字符串将为空或以(逗号和空格)开头。 STUFF()将删除前两个字符并返回字符串的其余部分。