不久前,我发布了一个类似的问题,现在由于需要更新此代码,我又回头问了一个后续问题。上一个问题在这里:
Computed column based on nullable columns
我的数据(Address1, Address2, City, State, Zip, Country
)可能包含不完整的信息。即我不能保证除State
和Country
列以外的任何内容都会有数据。
我想要一个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 + ', ', '')
将为空字符串或有效地址。