连接列并删除 leading/trailing 分隔符的脚本

Script to concatenate columns and remove leading/trailing delimiter

我有一个这样的 table,我想 return 连接列值位于 ('01', '02', '03', '04', ' 99').另外,这些值将由“;”分隔。所以第 1 行将是 01;04,第 3 行将是 01;02;03;04,第 5 行将只是 01。所有 leading/trailing ;应该被删除。什么脚本可以成功做到这一点?

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

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

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 将删除第一次出现的 ;

不建议将整数值存储在字符串中,但在这里应该可行。试试看,让我知道:

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

如果您使用 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'是显示的开始位置,因此您可以选择显示开始的字符位置。

(抱歉我的英语不好,希望它能帮助别人:))