用于连接列并删除前导/尾随分隔符的脚本

时间:2015-05-27 16:27:17

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

我有一个这样的表,我想返回列值在('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

3 个答案:

答案 0 :(得分: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将删除第一次出现的;

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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