我有一个这样的表,我想返回列值在('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
答案 0 :(得分:1)
您可以使用COALESCE
/ ISNULL
和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将删除第一次出现的;
答案 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'是显示器开始的位置,因此您可以选择显示器开始的字符位置。
(抱歉我的英文不好,希望能帮助别人:))