连接列并删除 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'是显示的开始位置,因此您可以选择显示开始的字符位置。
(抱歉我的英语不好,希望它能帮助别人:))
我有一个这样的 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'是显示的开始位置,因此您可以选择显示开始的字符位置。
(抱歉我的英语不好,希望它能帮助别人:))