【问题标题】:Function which takes a column values and convert it into a comma separated values接受列值并将其转换为逗号分隔值的函数
【发布时间】:2019-03-26 07:14:38
【问题描述】:

我想要一个 SQL 函数,它将 select 语句的结果作为参数,并为结果返回一串逗号分隔值。如果有 NULL 值,那么它应该留一个空格并继续显示结果。

我尝试使用 COALESCE() 表达式,但这会取出 NULL 值并仅返回有效值。

declare @str varchar(MAX)

SELECT @str= coalesce(@str + ',', '')+ a.D8_BOOK_YEAR_END 
FROM (select D8_BOOK_YEAR_END from CUST_PRODUCT_ACCOUNTS 
WHERE CUST_PRODUCT_ID=1) a

print @str 

例如:在图像中,我需要将列 NAME 传递给函数,它应该将值作为 Mango, ,Apple,Grape 返回给我。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012


    【解决方案1】:

    我想要一个 SQL 函数,它将 select 语句的结果作为参数返回一个逗号分隔值的字符串 作为结果. 如果有一个空值,那么它应该留一个空格并继续结果。

    你可以这样做

    --Create a table (just for test)
    CREATE TABLE T(
      Str VARCHAR(45)
    );
    
    INSERT INTO T VALUES
    ('One'),
    (NULL),
    ('Two'),
    ('Three');
    
    -- Create a type
    CREATE TYPE MyData AS TABLE (Str NVARCHAR(300));
    
    -- Create the function
    CREATE FUNCTION dbo.MyFunc(
      @Data MyData READONLY
    )
    RETURNS NVARCHAR(300)
    AS
    BEGIN
      DECLARE @Result NVARCHAR(300) = N'';
      SELECT @Result = STUFF(
                             ( 
                              SELECT ',' + ISNULL(Str, '') --Or ' ' as you like
                              FROM @Data 
                              FOR XML PATH('')
                             ), 1, 1, ''
                            ); 
      RETURN (@Result);
    END
    
    -- Finally, use it
    DECLARE @Test MyData;
    
    INSERT INTO @Test SELECT * FROM T;
    
    SELECT dbo.MyFunc(@Test);
    

    返回:

    +------------------+
    | (No column name) |
    +------------------+
    | One,,Two,Three   |
    +------------------+
    

    还有here is a live demo

    【讨论】:

      【解决方案2】:
      DECLARE @TABLE TABLE (
          ID INT 
          ,Info VARCHAR(MAX)
          )
      
      INSERT INTO @TABLE
      VALUES (1,'mango')
      
      INSERT INTO @TABLE
      VALUES (1,'apple')
      
      INSERT INTO @TABLE
      VALUES (1,null)
      
      INSERT INTO @TABLE
      VALUES (1,'grape')
      
      INSERT INTO @TABLE
      VALUES (2,'mango1')
      
      INSERT INTO @TABLE
      VALUES (2,null)
      
      INSERT INTO @TABLE
      VALUES (2,null)
      
      INSERT INTO @TABLE
      VALUES (2,'grape1')
      
      
      SELECT ID
          ,STUFF((
                  SELECT ',' + isnull(info, '')
                  FROM @TABLE T1
                  WHERE T1.id = T2.ID
                  FOR XML PATH('')
                  ), 1, 1, '')
      FROM @TABLE T2
      GROUP BY ID
      

      【讨论】:

        【解决方案3】:

        在某处使用ISNULL(field,' ') 以避免NULL 值行为。

        【讨论】:

          【解决方案4】:

          您可以使用SQL Concatenation using XML PATH() 方法,如以下示例查询所示

          SELECT
            STUFF(
              (
              SELECT
                ',' + [user]
              FROM dbo.UserCategoryValues
              FOR XML PATH(''),TYPE
              ).value('.','VARCHAR(MAX)'
              ), 1, 1, ''
            ) As concatenated_string
          

          这将处理 NULL 值。这些 NULL 不会连接到列表中

          但是您不能将此代码包装成一个动态 SQL 函数,该函数将获取字段名和表名并动态构建 SQL 语句。这种情况下SQL引擎会抛出异常

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-02
            • 1970-01-01
            • 1970-01-01
            • 2019-12-28
            • 2021-09-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多