Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 建立一个逗号分隔的列表?_Sql_Sql Server_Tsql_Csv - Fatal编程技术网

Sql 建立一个逗号分隔的列表?

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上

我正在尝试使用SQL来构建一个以逗号分隔的cat_id列表

代码是:

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