建立逗号分隔列表?

时间:2009-10-14 08:25:57

标签: sql sql-server tsql csv

我正在尝试使用SQL构建逗号分隔的cat_id

列表

代码是:

declare     @output varchar(max)
set         @output = null;
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id)

编辑:将''更改为null,STILL相同。 但我得到的输出是这样的:

, 66 , 23

领先的逗号不应该存在。我错过了什么?

9 个答案:

答案 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

http://www.sqlservercentral.com/articles/T-SQL/67973/

答案 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