SQL Server连接忽略空值

SQL Server连接忽略空值,sql,sql-server,tsql,concatenation,Sql,Sql Server,Tsql,Concatenation,我目前正在处理一个查询,该查询将多个列连接到一个字符串中,并使用逗号(,)作为分隔符。我不知道如何处理空值 DECLARE @item1 nvarchar(max) = 'a', @item2 nvarchar(max) = 'b', @item3 nvarchar(max) = 'c' SELECT CONCAT( ISNULL(NULLIF(@item1, '') + ', ', ''), ISNULL(NULLIF(@item2, '') +

我目前正在处理一个查询,该查询将多个列连接到一个字符串中,并使用逗号(,)作为分隔符。我不知道如何处理空值

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
都是空值时,它工作得很好,但如果
@item3
为空值,则会有一个问题,它将在末尾有一个额外的逗号(,)

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

--@item1 = 'a', @item2 = NULL, @item3 = NULL
--Output : a,
我知道这是因为我对
@item1
@item2
NULLIF
语句中的逗号(,)进行了硬编码,但我想不出还有其他更好的方法


对于这个问题有什么建议或更好的解决方案吗?

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

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

这里可以使用concat操作符, 对于第一个变量,不要传递concat分隔符,从第二个变量开始,在变量之前传递concat变量(分隔符)…

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

请参阅,如果任何值的值为
'
NULL
,则这不会返回OP想要的结果。