情况只有在有值时才添加逗号

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工作方式的一个有趣的误解.我确实确保这些字段实际上是空的而不是空的,所以这不是问题.

Dam*_*ver 7

请考虑以下事项:当您在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_NULLON,但它在默认情况下和真的应该是:

在SQL Server的未来版本中,CONCAT_NULL_YIELDS_NULL将始终显示ON任何明确设置该选项的应用程序OFF将生成错误.避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序.