kor*_*wan 0 t-sql case sql-update
我有一个多字段,只有当字段中有东西时才需要放入字符串中,除此之外,如果它们为null,我不希望字段之间有逗号.我尝试使用案例,但显然做错了什么,并希望得到以下一些帮助:
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
Run Code Online (Sandbox Code Playgroud)
当我在一个字段上执行该操作时,我会得到虚无...而且我不确定为什么这可能是对CASE工作方式的一个有趣的误解.我确实确保这些字段实际上是空的而不是空的,所以这不是问题.
请考虑以下事项:当您在SQL中将字符串连接在一起时,其中一个是null,结果是null(*).因此,如果在删除nulls 之前添加逗号,则更容易:
SELECT COALESCE(b.OCAREOF + ' ,','') + COALESCE(b.O1STADD + ' ,','') + ...
Run Code Online (Sandbox Code Playgroud)
没有CASE此需要.
COALESCE类似于ISNULL并且通常会被推荐,除了一些奇怪的情况 - 例如,它是标准SQL的一部分(如果你必须与其他RDBMS一起工作很有用),另一个它可以接受多个参数并返回第一个非NULL一个.考虑到每个表达式的类型,它为结果使用最合适的数据类型 - ISNULL总是尝试将第二个参数转换为第一个的类型.
(我也不确定你在CASE表达式中做了什么- 你已经确定了,例如OCAREOF是null - 之后没有必要使用ISNULL表达式来获取'')
(*)作为康拉德指出,SQL Server上这也要看CONCAT_NULL_YIELDS_NULL是ON,但它在默认情况下和它真的应该是:
在SQL Server的未来版本中,
CONCAT_NULL_YIELDS_NULL将始终显示ON任何明确设置该选项的应用程序OFF将生成错误.避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序.