0

我有多个字段,仅当字段中有内容时才需要将其放入字符串中,最重要的是,如果字段为空,我不希望字段之间的逗号。我尝试使用 case when 但显然做错了什么,并希望在以下方面提供一些帮助:

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工作原理的根本误解。我确实确保这些字段实际上是空的,而不是空的,所以这不是问题。

4

2 回答 2

7

考虑以下情况:当您在 SQL 中将字符串连接在一起时,其中之一是null,结果是null(*)。所以,如果你在消除s之前null添加逗号,它会更容易一点:

SELECT COALESCE(b.OCAREOF + ' ,','') + COALESCE(b.O1STADD + ' ,','') + ...

这里不需要CASE

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


(我也不确定我们在你的CASE表达式中做了什么——你已经确定了,例如OCAREOF为 null——没有必要再使用ISNULL表达式来获取''


(*) 正如 Conrad 指出的那样,在 SQL Server 上,这确实取决于CONCAT_NULL_YIELDS_NULLbeing ON,但默认情况下确实应该是

在 SQL Server 的未来版本中,任何显式设置该选项的应用程序CONCAT_NULL_YIELDS_NULL都会生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。ONOFF

于 2013-01-15T14:11:28.193 回答
0

即使后面没有值,该解决方案仍会添加逗号。从 SQL Server 2017 开始,您可以CONCAT_WS像这样使用 (= concat with separator):

UPDATE PropertyInformationDump
   SET RegistryAdd = concat_ws(' ,', b.OCAREOF, b.O1STADD, b.O2NDADD, ...) 
于 2021-11-01T16:25:44.157 回答