我前一段时间发布了一个类似的问题,现在我需要更新此代码,我回来问一个后续问题。以前的问题在这里:
Computed column based on nullable columns
我的数据(Address1, Address2, City, State, Zip, Country
)可能包含不完整的信息。即我无法保证State
和Country
列以外的任何内容都有数据。
我希望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
我现在有点卡住了。有什么建议可以尝试下一步吗?
答案 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()
将删除前两个字符并返回字符串的其余部分。