【问题标题】:Building a comma separated list?建立一个逗号分隔的列表?
【发布时间】:2009-10-14 08:25:57
【问题描述】:

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

代码是:

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

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

, 66 , 23

前导逗号不应该在那里。我错过了什么?

【问题讨论】:

    标签: sql sql-server tsql csv


    【解决方案1】:

    您使用的是 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 实例来测试它,所以它来自内存。您可能必须使用 stuff 参数等才能使其完全按照您想要的方式工作。

    【讨论】:

    • 我想附加到这个答案 - 对于很多 STUFF 语句,您希望参数为 1 和 1,而不是 1 和 2,以创建真正的逗号分隔列表。马特的答案使用 2 因为他在每个逗号后都有一个空格。有关详细信息,请查看 MSDN 文章:msdn.microsoft.com/en-us/library/ms188043.aspx
    【解决方案2】:

    合并Returns the first nonnull expression among its arguments

    第一个参数@output + ', ' 永远不会为空(除非您将@output 初始化为空并将CONCAT_NULL_YIELDS_NULL 设置为ON),所以它总是被返回。

    【讨论】:

    • +1 表示指向 ANSI 属性的指针。使用“select sessionproperty('CONCAT_NULL_YIELDS_NULL')”查看其当前值;默认为1,如果为0,会导致poster的COALESCE失败。
    【解决方案3】:

    有时……

    你必须回答你自己的问题

    declare     @output varchar(max)
    select      @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id)
    

    【讨论】:

      【解决方案4】:

      在执行这个查询之前检查@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
      

      【讨论】:

      • 即便如此CONCAT_NULL_YIELDS_NULL 也需要设置为ON
      【解决方案5】:
      declare     @output varchar(max)
      
      select      @output = coalesce
                            ( 
                                @output + ', ' + convert(varchar(max),cat_id), 
                                convert(varchar(max),cat_id)
                            )
      from        yourTableHere
      
      print       @output
      

      【讨论】:

        【解决方案6】:

        您是否将@output 初始化为空字符串? COALESCE 仅在它是 NULL 字符串时才有效。

        【讨论】:

          【解决方案7】:

          你做错的是@output 从一开始就不是空的,而是一个空字符串。在循环之前将 @output 设置为 null (或者如果它没有被使用,因为它被声明了只是不要给它分配一个空字符串)。

          【讨论】:

            【解决方案8】:

            不确定这是否完全适用于您正在寻找的内容,但我在找到您的问题的同时也发现了这一点。我将第二个解决方案与 FOR XML PATH 一起使用,上面提到了 Matt Hamilton。对我来说效果很好。

            连接行 - Carl P. Anderson,2009/10/14

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

            【讨论】:

              【解决方案9】:

              在 Unix 上,sqlminus 命令可让您合并 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
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-12-16
                • 2019-03-07
                • 2013-07-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多