SQL Server连接忽略空值

5

我目前正在处理一个查询,将多列连接成一个字符串,并使用逗号(,)作为分隔符。我无法解决如何处理空值的问题。

DECLARE 
    @item1 nvarchar(max) = 'a',
    @item2 nvarchar(max) = 'b',
    @item3 nvarchar(max) = 'c'

SELECT CONCAT(
    ISNULL(NULLIF(@item1, '') + ', ', ''), 
    ISNULL(NULLIF(@item2, '') + ', ', ''), 
    ISNULL(NULLIF(@item3, ''), '')
)

--@item1 = 'a', @item2 = 'b', @item3 = 'c'
--Output : a, b, c

--@item1 = 'a', @item2 = NULL, @item3 = 'c'
--Output : a, c

--@item1 = NULL, @item2 = 'b', @item3 = 'c'
--Output : b, c

以上代码在@item1@item2或两者都为NULL值时运行良好,但如果@item3是NULL值,则会在结尾处多出一个逗号(,)

--@item1 = 'a', @item2 = 'b', @item3 = NULL
--Output : a, b,

--@item1 = 'a', @item2 = NULL, @item3 = NULL
--Output : a,

我知道这是因为在NULLIF语句中硬编码了逗号(,)导致的,但我无法想出其他更好的解决方法。
对此有何建议或更好的解决方案?

请参见 https://stackoverflow.com/posts/comments/93273211。 - Salman A
3个回答

8

STUFF方法可能在这里是更好的选择:

STUFF(CONCAT(',' + NULLIF(@item1, ''),',' + NULLIF(@item2, ''),',' + NULLIF(@item3, '')),1,1,'')

1
CONCAT_WS(', ', NULLIF(@item1,''), NULLIF(@item2,''), NULLIF(@item3,''))

0

在这里,您可以使用连接运算符。对于第一个变量,请不要传递连接分隔符,从第二个变量开始,在变量之前传递连接变量(分隔符)...

declare @a varchar(10)='a'
declare @b varchar(10)='b'
declare @c varchar(10)=null
select isnull(@a,'')+isnull(','+@b,'')+isnull(','+@c,'')

如果任何一个值具有''NULL的值,这不会返回OP想要的结果。 - Thom A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接