Tsql 仅当存在值时才添加逗号的情况

Tsql 仅当存在值时才添加逗号的情况,tsql,sql-update,case,Tsql,Sql Update,Case,我有一个多字段,只有当字段中有内容时才需要将其放入字符串中,而且如果字段为空,我不希望字段之间出现逗号。我在尝试使用case时,但显然做了一些错误的事情,并希望得到以下方面的帮助: USE newCityCollection UPDATE PropertyInformationDump SET RegistryAdd = (CASE WHEN b.OCAREOF IS NULL THEN Isnull(b.OCAREOF, '')

我有一个多字段,只有当字段中有内容时才需要将其放入字符串中,而且如果字段为空,我不希望字段之间出现逗号。我在尝试使用case时,但显然做了一些错误的事情,并希望得到以下方面的帮助:

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

当我在一个字段上执行该操作时,我得到了nada,但不确定为什么这可能是对
案例
工作原理的基本误解。我确实确保了这些字段实际上是null且不是空的,所以这不是问题。

考虑以下几点:当您在SQL中将字符串连接在一起时,其中一个是
null
,结果是
null
(*)。因此,如果在消除
null
s之前添加逗号,则更容易:

SELECT COALESCE(b.OCAREOF + ' ,','') + COALESCE(b.O1STADD + ' ,','') + ...
此处不需要
案例

COALESCE
类似于
ISNULL
,除了一些奇怪的情况外,通常建议使用它-一方面,它是标准SQL的一部分(如果您必须处理其他RDBMS,它会很有用),另一方面,它可以接受多个参数并返回第一个非
NULL
参数。对于第三个,考虑到每个表达式的类型,它为结果使用最合适的数据类型—
ISNULL
始终尝试将第二个参数转换为第一个参数的类型)


(我也不确定我们在您的
案例
表达式中做了什么-您已经确定了,例如
OCAREOF
为空-没有必要使用
ISNULL
表达式来获得
'


(*)正如Conrad指出的,在SQL Server上,这确实取决于
CONCAT\u NULL\u NULL
是否为
on
,但默认情况下是这样的:

在SQL Server的未来版本中,
CONCAT\u NULL\u NULL
将始终是
ON
,任何显式将选项设置为
OFF
的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序


@ConradFrix-作为脚注添加。非常感谢。我用IsNull试过了,但失败了,所以我尝试了其他方法。将来将使用合并!好消息!美好的这也可以使用
nullif
coalesce(','+nullif(O1STADD'))处理空字符串字段。
这个查询是一个小怪物:D;)