【问题标题】:Script to concatenate columns and remove leading/trailing delimiter用于连接列并删除前导/尾随分隔符的脚本
【发布时间】:2015-08-09 21:01:15
【问题描述】:

我有一个这样的表,我想返回列值所在的串联字符串('01'、'02'、'03'、'04'、'99')。另外,这些值将由';'分隔。所以第 1 行将是 01;04,第 3 行将是 01;02;03;04,第 5 行将只是 01。所有前导/尾随 ;应该被删除。什么脚本会成功?

R_NOT_CUR   R_NOT_CUR_2 R_NOT_CUR_3 R_NOT_CUR_4
01          NULL        04          NULL
98          56          45          22
01          02          03          04
NULL        NULL        NULL        NULL
01          NULL        NULL        NULL

【问题讨论】:

    标签: sql tsql sql-server-2005 relational-database


    【解决方案1】:

    您可以使用COALESCE / ISNULLSTUFF 完成此操作。像这样。

    SELECT STUFF(
         COALESCE(';'+R_NOT_CUR,'')
         + COALESCE(';'+R_NOT_CUR_2,'')
         + COALESCE(';'+R_NOT_CUR_3,'')
         + COALESCE(';'+R_NOT_CUR_4,''),1,1,'')
    FROM YourTable
    

    Stuff 将删除第一次出现的;

    【讨论】:

    • 我用 CASE 语句代替 R_NOT_CUR、R_NOT_CUR_2、R_NOT_CUR_3、R_NOT_CUR_4 稍微更新了您的脚本,以过滤非 ('01'、'02'、'03'、'04'、 '99'),然后按要求工作。谢谢。
    【解决方案2】:

    不建议将整数值存储在字符串中,但在这里应该可以。试试看并告诉我:

    DECLARE @yourTable TABLE (R_NOT_CUR VARCHAR(10),R_NOT_CUR_2 VARCHAR(10),R_NOT_CUR_3 VARCHAR(10),R_NOT_CUR_4 VARCHAR(10));
    
    INSERT INTO @yourTable
    VALUES  ('01',NULL,'04',NULL),
            ('98','56','45','22'),
            ('01','02','03','04'),
            (NULL,NULL,NULL,NULL),
            ('01',NULL,NULL,NULL);
    
    WITH CTE_row_id
    AS
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) row_id, --identifies each row
                R_NOT_CUR,
                R_NOT_CUR_2,
                R_NOT_CUR_3,
                R_NOT_CUR_4
        FROM @yourTable
    ),
    CTE_unpivot --puts all values in one column so your can apply your where logic
    AS
    (
        SELECT *
        FROM CTE_row_id
        UNPIVOT
        (
            val FOR col IN (R_NOT_CUR,R_NOT_CUR_2,R_NOT_CUR_3,R_NOT_CUR_4)
        ) unpvt
        WHERE val IN ('01','02','03','04','99')
    )
    
    SELECT  STUFF(
                COALESCE(';'+R_NOT_CUR,'')   +
                COALESCE(';'+R_NOT_CUR_2,'') +
                COALESCE(';'+R_NOT_CUR_3,'') + 
                COALESCE(';'+R_NOT_CUR_4,'')
            ,1,1,'')
            AS concat_columns
    FROM CTE_unpivot
    PIVOT
    (
        MAX(val) FOR col IN(R_NOT_CUR,R_NOT_CUR_2,R_NOT_CUR_3,R_NOT_CUR_4)
    ) pvt
    

    结果:

    concat_columns
    --------------------------------------------
    01;04
    01;02;03;04
    01
    

    【讨论】:

    • 您的脚本有效,但也许我应该在我的问题中补充一点,即我的示例表只是一个更大的表的一小部分,因此虽然通用表表达式可以工作,但它并不理想,因为在我的经验是 CTE 对数据库的资源影响太大。但是非常感谢您的努力!
    【解决方案3】:

    如果你使用SUBSTRING,那么已经有一个参数可以让你删除字符

    SUBSTRING((SELECT CONCAT('/',p.YourValue)
                FROM YourTable p
                Where p.value2 = YourCondition
                AND pc1.ProfilID = p.ProfilID
                FOR XML PATH ('')), 
                2, 1000) [ColonneTitle],
    

    其中的值'2'是显示开始的位置,所以你可以选择开始显示的字符位置。

    (抱歉我的英语不好,希望对某人有所帮助:))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 2020-11-24
      • 2013-02-10
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多