我有一个多个字段,只有在字段中有内容时才需要放入字符串中,除此之外我不想在字段之间使用逗号(如果它们为空)。我尝试使用案例,但显然做错了什么,并希望对以下内容有所帮助:
USE newCityCollection
UPDATE PropertyInformationDump
SET RegistryAdd = (CASE
WHEN b.OCAREOF IS NULL THEN Isnull(b.OCAREOF, '')
ELSE b.OCAREOF + ' ,'
END) + (CASE
WHEN b.O1STADD IS NULL THEN Isnull(b.O1STADD, '')
ELSE b.O1STADD + ' ,'
END) + (CASE
WHEN b.O2NDADD IS NULL THEN Isnull(b.O2NDADD, '')
ELSE b.O2NDADD + ' ,'
END) + (CASE
WHEN b.OSTNAME IS NULL THEN Isnull(b.OSTNAME, '')
ELSE b.OSTNAME + ' ,'
END) + (CASE
WHEN b.OCITYST IS NULL THEN Isnull(b.OCITYST, '')
ELSE b.OCITYST + ' ,'
END) + (CASE
WHEN b.OZIP IS NULL THEN Isnull(b.OZIP, '')
ELSE b.OZIP + ' ,'
END)
FROM dbo.vw_BRT b
WHERE BRTNumber = b.PARCEL
当我在一个字段上执行该操作时,我得到了虚无...而且我不确定为什么这可能是对CASE
如何工作的一个有趣的误解。我确实确保这些字段实际上是空的而不是空的,所以这不是问题。
答案 0 :(得分:7)
请考虑以下事项:当您在SQL中将字符串连接在一起时,其中一个字符串为null
时,结果为null
(*)。因此,如果您在消除null
之前添加逗号,则会更容易:
SELECT COALESCE(b.OCAREOF + ' ,','') + COALESCE(b.O1STADD + ' ,','') + ...
此处不需要CASE
。
COALESCE
类似于ISNULL
,除了一些奇怪的情况外,通常会被推荐 - 例如,它是标准SQL的一部分(如果您必须对其他RDBMS工作,则非常有用),另一个它可以接受多个参数并返回第一个非NULL
参数。考虑到每个表达式的类型,它为结果使用最合适的数据类型 - ISNULL
总是尝试将第二个参数转换为第一个参数的类型
(我也不确定你在CASE
表达式中做了什么 - 你已经确定了,例如OCAREOF
为空 - 没有必要再使用{ {1}}表达式获取ISNULL
)
(*)正如Conrad指出的那样,在SQL Server上,这取决于''
是否为CONCAT_NULL_YIELDS_NULL
,但它默认为it really should be:
在SQL Server的未来版本中,
ON
始终为CONCAT_NULL_YIELDS_NULL
,任何明确将选项设置为ON
的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。