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

时间:2013-01-15 14:05:14

标签: tsql sql-update 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

当我在一个字段上执行该操作时,我得到了虚无...而且我不确定为什么这可能是对CASE如何工作的一个有趣的误解。我确实确保这些字段实际上是空的而不是空的,所以这不是问题。

1 个答案:

答案 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的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。