Sql 建立一个逗号分隔的列表?
我正在尝试使用SQL来构建一个以逗号分隔的cat_id列表 代码是:Sql 建立一个逗号分隔的列表?,sql,sql-server,tsql,csv,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,仍然相同。 但是我得到的结果是这样的: , 66 , 23 前面的逗号不应该在那里。我错过了什么?您在SQL 2005上
declare @output varchar(max)
set @output = null;
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id)
编辑:已将“”更改为null,仍然相同。
但是我得到的结果是这样的:
, 66 , 23
前面的逗号不应该在那里。我错过了什么?您在SQL 2005上吗?最近给我看这部电影的人的道具:
SELECT stuff((
SELECT ', ' + cast(cat_id as varchar(max))
FROM categories
FOR XML PATH('')
), 1, 2, '');
内部查询(对于XML路径(“”))选择一个以逗号分隔的类别ID列表,并以“,”开头。外部查询使用该函数删除前导逗号和空格
我手头没有SQL实例来测试这个,所以它是从内存中获得的。您可能需要使用stuff参数等,以使其完全按照您的意愿工作。检查
@output
值就在执行此查询之前,我认为它不等于NULL
而是等于“”(空字符串)
编辑:(在@auth编辑问题之后)
现在我确定是“”
您必须将其初始化为NULL
要独立于CONCAT\u NULL\u产生\u NULL
,请在以下情况下使用旧的案例:
select @output = NULL
select @output = CASE WHEN @output IS NULL THEN '' ELSE @output+', ' END + value
您是否将@output初始化为空字符串?COALESCE只有在为空字符串时才起作用。您所犯的错误是@output从一开始就不是空字符串,而是空字符串。在循环之前将@output设置为null(或者如果由于声明了@output而未使用它,则不要为其分配空字符串)。合并
第一个参数@output+”,“
从不为null(除非您将@output
初始化为null并设置为ON
),因此它总是返回。有时
你必须回答你自己的问题
declare @output varchar(max)
select @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id)
不确定这是否完全适用于您所寻找的内容,但我在找到您的问题的同时发现了这一点。我使用Matt Hamilton上面提到的用于XML路径的第二个解决方案。这对我很有效
连接行-卡尔·p·安德森,2009/10/14
在Unix上,SQL减号命令允许合并SQL命令和其他格式:
% 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
即使是这样,CONCAT\u NULL\u NULL
也需要设置为ON
+1,以便指针指向ANSI属性。使用“select sessionproperty('CONCAT\u NULL\u YIELDS\u NULL')查看其当前值;默认值为1,但如果为0,则会导致海报合并失败。我想在这个答案后面附加一个参数-对于许多STUFF语句,您希望参数为1和1,而不是1和2,以创建一个真正的逗号分隔列表。Matt的答案使用2,因为每个逗号后都有空格。有关更多信息,请查看MSDN文章:
% 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