我正在尝试使用SQL构建逗号分隔的cat_id
列表代码是:
declare @output varchar(max)
set @output = null;
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id)
编辑:将''更改为null,STILL相同。 但我得到的输出是这样的:
, 66 , 23
领先的逗号不应该存在。我错过了什么?
答案 0 :(得分:46)
你是SQL 2005吗?使用Rob Farley的道具最近向我展示了这个:
SELECT stuff((
SELECT ', ' + cast(cat_id as varchar(max))
FROM categories
FOR XML PATH('')
), 1, 2, '');
内部查询(带FOR XML PATH('')
)选择以逗号分隔的类别ID列表,带有前导“,”。外部查询使用stuff函数删除前导逗号和空格。
我没有一个SQL实例可以方便地测试它,所以它来自内存。您可能必须使用填充参数等来使其完全按照您的需要工作。
答案 1 :(得分:2)
COALESCE Returns the first nonnull expression among its arguments
第一个参数@output + ', '
永远不会为空(除非您将@output
初始化为null并将CONCAT_NULL_YIELDS_NULL
设置为ON
),因此它始终会返回。
答案 2 :(得分:1)
declare @output varchar(max)
select @output = coalesce
(
@output + ', ' + convert(varchar(max),cat_id),
convert(varchar(max),cat_id)
)
from yourTableHere
print @output
答案 3 :(得分:0)
在执行此查询之前检查@output
值,我认为它不等于NULL
而是等于''(空字符串)
编辑:(在@auth编辑问题之后)
现在我确定它是'',
您必须将其初始化为NULL
独立于CONCAT_NULL_YIELDS_NULL
执行此操作,请使用旧的CASE WHEN
:
select @output = NULL
select @output = CASE WHEN @output IS NULL THEN '' ELSE @output+', ' END + value
答案 4 :(得分:0)
您是否将@output初始化为空字符串? COALESCE只有在为NULL字符串时才会起作用。
答案 5 :(得分:0)
你做错了是@output从一开始就不是空的,而是一个空字符串。在循环之前将@output设置为null(或者如果它没有被使用,因为它被声明只是不为它分配一个空字符串)。
答案 6 :(得分:0)
有时......
你必须回答你自己的问题
declare @output varchar(max)
select @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id)
答案 7 :(得分:0)
不确定这是否恰好适用于您所寻找的内容,但我在找到您的问题的同时发现了这一点。我使用FOR XML PATH的第二个解决方案,Matt Hamilton在上面提到过。它对我很有用。
连接行 - 作者:Carl P. Anderson,2009/10/14
答案 8 :(得分:-2)
/osp/install/idp/bin/sqlminus "select ri || ',' ||name|| ',' || numports || ',' || ascii(OVRONSET) from sdfctigw.ivrgrp where GRP_BEP is not null;" | sort -h
1,COMO INTERNAL 2,700,90
7,LOADIVR,10,80
10,SPEECH_IVR_PROD,600,95