Sql 根据现有列选择逗号分隔字符串
我的数据库中有一个表,它有一组位值列。我想在新列中插入逗号分隔的字符串,具体取决于这些位列的值 假设列的名称为:Sql 根据现有列选择逗号分隔字符串,sql,sql-server,Sql,Sql Server,我的数据库中有一个表,它有一组位值列。我想在新列中插入逗号分隔的字符串,具体取决于这些位列的值 假设列的名称为: c1,c2,c3,c4 如果列中的值等于1,我希望包括映射如下的字符串: c1: 'campaign1' c2: 'campaign2' c3: 'campaign3' c4: 'campaign4' 例如,如果一行包含以下值: c1 = 1, c2 = 0, c3 = 1, c4 = 0 我想在名为“活动”的新列中插入以下内容 'campaign1,campaign3' 关
c1,c2,c3,c4
如果列中的值等于1,我希望包括映射如下的字符串:
c1: 'campaign1'
c2: 'campaign2'
c3: 'campaign3'
c4: 'campaign4'
例如,如果一行包含以下值:
c1 = 1, c2 = 0, c3 = 1, c4 = 0
我想在名为“活动”的新列中插入以下内容
'campaign1,campaign3'
关于如何实现这一点有什么建议吗?这是可行的,但可能不是最好的解决方案:
DECLARE @table TABLE (id INT, c1 INT, c2 INT, c3 INT, c4 INT);
INSERT INTO @table
SELECT 1, 1, 0, 1, 0
UNION ALL
SELECT 2, 0, 0, 1, 1;
WITH cte AS (
SELECT
id,
CASE WHEN c1 = 1 THEN 'campaign1,' ELSE '' END +
CASE WHEN c2 = 1 THEN 'campaign2,' ELSE '' END +
CASE WHEN c3 = 1 THEN 'campaign3,' ELSE '' END +
CASE WHEN c4 = 1 THEN 'campaign4,' ELSE '' END AS campaigns
FROM
@table)
SELECT
id,
CASE
WHEN LEN(campaigns) > 0 THEN LEFT(campaigns, LEN(campaigns) - 1)
ELSE ''
END AS campaigns
FROM
cte;
Gordon击败了我,提出了
方法,当我意识到这更好时,我正在匆忙编写该方法,但下面的回答也说明了更新的工作原理,因为这是您最初要求的:
DECLARE @table TABLE (id INT, c1 INT, c2 INT, c3 INT, c4 INT, campaigns VARCHAR(512));
INSERT INTO @table
SELECT 1, 1, 0, 1, 0, NULL
UNION ALL
SELECT 2, 0, 0, 1, 1, NULL;
UPDATE
t
SET
campaigns = STUFF(CASE WHEN c1 = 1 THEN ',campaign1' ELSE '' END +
CASE WHEN c2 = 1 THEN ',campaign2' ELSE '' END +
CASE WHEN c3 = 1 THEN ',campaign3' ELSE '' END +
CASE WHEN c4 = 1 THEN ',campaign4' ELSE '' END, 1, 1, '')
FROM
@table t;
SELECT * FROM @table;
结果:
id c1 c2 c3 c4 campaigns
1 1 0 1 0 campaign1,campaign3
2 0 0 1 1 campaign3,campaign4
这是可行的,但可能不是最好的解决方案:
DECLARE @table TABLE (id INT, c1 INT, c2 INT, c3 INT, c4 INT);
INSERT INTO @table
SELECT 1, 1, 0, 1, 0
UNION ALL
SELECT 2, 0, 0, 1, 1;
WITH cte AS (
SELECT
id,
CASE WHEN c1 = 1 THEN 'campaign1,' ELSE '' END +
CASE WHEN c2 = 1 THEN 'campaign2,' ELSE '' END +
CASE WHEN c3 = 1 THEN 'campaign3,' ELSE '' END +
CASE WHEN c4 = 1 THEN 'campaign4,' ELSE '' END AS campaigns
FROM
@table)
SELECT
id,
CASE
WHEN LEN(campaigns) > 0 THEN LEFT(campaigns, LEN(campaigns) - 1)
ELSE ''
END AS campaigns
FROM
cte;
Gordon击败了我,提出了方法,当我意识到这更好时,我正在匆忙编写该方法,但下面的回答也说明了更新的工作原理,因为这是您最初要求的:
DECLARE @table TABLE (id INT, c1 INT, c2 INT, c3 INT, c4 INT, campaigns VARCHAR(512));
INSERT INTO @table
SELECT 1, 1, 0, 1, 0, NULL
UNION ALL
SELECT 2, 0, 0, 1, 1, NULL;
UPDATE
t
SET
campaigns = STUFF(CASE WHEN c1 = 1 THEN ',campaign1' ELSE '' END +
CASE WHEN c2 = 1 THEN ',campaign2' ELSE '' END +
CASE WHEN c3 = 1 THEN ',campaign3' ELSE '' END +
CASE WHEN c4 = 1 THEN ',campaign4' ELSE '' END, 1, 1, '')
FROM
@table t;
SELECT * FROM @table;
结果:
id c1 c2 c3 c4 campaigns
1 1 0 1 0 campaign1,campaign3
2 0 0 1 1 campaign3,campaign4
我会使用stuff()
和一些字符串操作来实现这一点:
select t.*,
stuff( ((case when c1 = 1 then ',campaign1' else '' end) +
(case when c2 = 1 then ',campaign2' else '' end) +
(case when c3 = 1 then ',campaign3' else '' end) +
(case when c4 = 1 then ',campaign4' else '' end)
), 1, 1, ''
) as campaigns
from t;
我会使用stuff()
和一些字符串操作来实现这一点:
select t.*,
stuff( ((case when c1 = 1 then ',campaign1' else '' end) +
(case when c2 = 1 then ',campaign2' else '' end) +
(case when c3 = 1 then ',campaign3' else '' end) +
(case when c4 = 1 then ',campaign4' else '' end)
), 1, 1, ''
) as campaigns
from t;
您可以按以下方式使用函数(前提是您使用的是SQL Server 2012+):
select IIF(c1=1, 'Campaign1', '')+IIF(c2=1 and c1>0,',','')+
IIF(c2=1, 'Campaign2', '')+IIF(c3=1 and c1+c2>0,',','')+
IIF(c3=1, 'Campaign3', '')+IIF(c4=1 and c1+c2+c3>0,',','')+
IIF(c4=1, 'Campaign4', '') as 'Campaigns'
from tab t;
您可以按以下方式使用函数(前提是您使用的是SQL Server 2012+):
select IIF(c1=1, 'Campaign1', '')+IIF(c2=1 and c1>0,',','')+
IIF(c2=1, 'Campaign2', '')+IIF(c3=1 and c1+c2>0,',','')+
IIF(c3=1, 'Campaign3', '')+IIF(c4=1 and c1+c2+c3>0,',','')+
IIF(c4=1, 'Campaign4', '') as 'Campaigns'
from tab t;
为了提供另一个选项,您可以使用concat,也可以使用replace
DECLARE @table TABLE (id INT, c1 INT, c2 INT, c3 INT, c4 INT)
INSERT INTO @table
SELECT 1, 1, 0, 1, 0 UNION ALL SELECT 2, 0, 0, 1, 1
select t.*,
replace(replace(c1, '1', 'Campaing1,'), '0', '') +
replace(replace(c2, '1', 'Campaing2,'), '0', '') +
replace(replace(c3, '1', 'Campaing3,'), '0', '') +
replace(replace(c4, '1', 'Campaing4,'), '0', '')
from @table t
结果是
id c1 c2 c3 c4 COLUMN1
-- -- -- -- -- -------
1 1 0 1 0 Campaing1,Campaing3,
2 0 0 1 1 Campaing3,Campaing4,
但我会选择Gordon的答案,只是为了给你另一个选择,你可以使用concat,也可以替换
DECLARE @table TABLE (id INT, c1 INT, c2 INT, c3 INT, c4 INT)
INSERT INTO @table
SELECT 1, 1, 0, 1, 0 UNION ALL SELECT 2, 0, 0, 1, 1
select t.*,
replace(replace(c1, '1', 'Campaing1,'), '0', '') +
replace(replace(c2, '1', 'Campaing2,'), '0', '') +
replace(replace(c3, '1', 'Campaing3,'), '0', '') +
replace(replace(c4, '1', 'Campaing4,'), '0', '')
from @table t
结果是
id c1 c2 c3 c4 COLUMN1
-- -- -- -- -- -------
1 1 0 1 0 Campaing1,Campaing3,
2 0 0 1 1 Campaing3,Campaing4,
但我还是同意Gordon的答案请记住,像这样的列中的分隔数据违反1NF,是一个严重的PITA。请记住,像这样的列中的分隔数据违反1NF,是一个严重的PITA。