【问题标题】:Output a comma separated list in T-SQL在 T-SQL 中输出一个逗号分隔的列表
【发布时间】:2014-09-20 08:00:57
【问题描述】:

我有一张桌子,里面有电话号码。我不想为每个号码吐出一行,而是想返回一个逗号分隔的电话号码列表。在 sql 中执行此操作的最简单方法是什么?一个while循环?

【问题讨论】:

标签: sql tsql sql-server-2008


【解决方案1】:

其中一些答案对于合并和更复杂的 XML 查询过于复杂。我一直用这个:

select @Phones=(
  Select PhoneColumn+','
  From TableName
  For XML Path(''))
-- Remove trailing comma if necessary
select @Phones=left(@Phones,len(@Phones)-1)

【讨论】:

    【解决方案2】:

    你可以创建一个 UDF 来做这样的事情

    CREATE FUNCTION dbo.GetBirthdays(@UserId INT)
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
    DECLARE @combined VARCHAR(MAX)
    SELECT  @combined = COALESCE(@combined + ', ' + colName + ', colName)
    FROM    YourTable
    WHERE UserId = @UserId
    ORDER BY ColName
    
    END
    

    基本上,这只是将所有值提取到一个简单的列表中。

    【讨论】:

      【解决方案3】:

      FWIW 我创建了一个 SQL CLR 聚合函数。像冠军一样工作!

      [可序列化] [SqlUserDefinedAggregate(Format.UserDefined, 名称 = "JoinStrings", IsInvariantToNulls=true, IsInvariantToDuplicates=false, IsInvariantToOrder=false, MaxByteSize=8000)] 公共结构 加入字符串:IBinarySerialize { 公共字符串结果;

      public void Init()
      {
          Result = "";
      }
      public void Accumulate(SqlString value)
      {
          if (value.IsNull)
              return;
      
          Result += value.Value + ",";
      
      }
      public void Merge(JoinStrings Group)
      {
          Result += Group.Result;
      }
      
      public SqlString Terminate()
      {
          return new SqlString(Result.ToString().Trim(new
      

      char[] { ',' })); }

      public void Read(System.IO.BinaryReader r)
      {
          Result = r.ReadString();
      }
      
      public void Write(System.IO.BinaryWriter w)
      {
          w.Write(Result.ToString());
      } }
      

      然后我可以这样使用它:

      SELECT dbo.JoinStrings(Phone) FROM Phones Where UserID = XXX
      

      【讨论】:

        【解决方案4】:

        question 中查看我的回答。该问题中还列出了其他几种方法。 COALESCE 或用于 xml 路径应该可以解决问题。

        编辑(添加了我对上一个问题的回答):

        CREATE FUNCTION [dbo].[fn_MyFunction]()RETURNS NVARCHAR(MAX)
         AS 
        BEGIN    
            DECLARE @str NVARCHAR(MAX)    
            DECLARE @Delimiter CHAR(2)     
            SET @Delimiter = ', '    
            SELECT @str = COALESCE(@str + @Delimiter,'') + AColumn    
             FROM dbo.myTable    
            RETURN RTRIM(LTRIM(@str))
         END
        

        【讨论】:

          【解决方案5】:

          假设您有一个具有唯一 ID 的客户表和另一个名为 PhoneNumbers 的表,其中每个客户的多个电话号码共享客户 ID 字段作为外键,这将使用相关的子查询来工作

          Select C.ID, C.FirstName, C.LastName,
          (select (STUFF(( SELECT ', ' + PhoneNumber from PhoneNumbers P where P.CID = C.ID
          FOR XML PATH('')), 1, 2, ''))) as PhoneNumbers
          from Customers C
          

          【讨论】:

            【解决方案6】:

            This question 有几个不错的选择。实际上,我已经提到了同一个问题并实施了一个或多个这些响应。

            Here 是另一组不错的选择。

            【讨论】:

              【解决方案7】:
              Select Unique ID, Replace(Rtrim(Ltrim(Case when [Phone_Number1] is not null Then [Phone_Number1]+'  ' Else '' End +
                                Case when [Phone_Number2] is not null Then [Phone_Number2]+'  ' Else '' End +
                                Case when [Phone_Number3] is not null Then [Phone_Number3]+'  ' Else '' End)),'  ',', ') as Phone_numbers
              
              From MYTable
              

              希望这是您正在寻找的内容,我不知道这是否会在问题结束后对您有所帮助。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-10-14
                • 1970-01-01
                • 2012-04-19
                • 1970-01-01
                • 1970-01-01
                • 2018-08-07
                • 1970-01-01
                • 2013-08-16
                相关资源
                最近更新 更多