Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据现有列选择逗号分隔字符串_Sql_Sql Server - Fatal编程技术网

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。