在所有其他列上添加带有OR运算结果的列[SQL Server]

时间:2017-03-15 10:21:14

标签: sql sql-server

我有一个包含100列的表,包含布尔值。我想添加一个包含所有先前列的OR结果的列。

现有表格:

web.config

我想获得的内容:

ID, COL1, COL2, COL3, ... , COL100
1, TRUE, FALSE, FALSE, ..., FALSE
2, FALSE, FALSE, TRUE, ..., FALSE
3, FALSE, FALSE, FALSE, ..., FALSE

感谢this post,我知道可以对所有其他列的名称进行硬编码。是否有非硬编码方式?

2 个答案:

答案 0 :(得分:3)

您可以使用动态SQL查询。但我不知道这会有多高效。

我假设列col1col2,....位于varchar数据类型

<强>查询

declare @sql as varchar(max);
select @sql = stuff((select '+ case ' + column_name 
             + ' when ' + char(39) + 'true' + char(39) 
             + ' then 1 else 0 end '
         from information_schema.columns
         where table_name = 'your_table_name'
         and column_name <> 'Id'
         for xml path('')
       ), 1, 1, '');

select @sql = 'select *, case when(' 
              + @sql + 
              ') > 0 then ' + char(39) + 'True' + char(39) 
              + ' else ' + char(39) + 'False' + char(39) + ' end Result 
              from your_table_name;';

 exec(@sql);

答案 1 :(得分:2)

动态SQL可以通过访问sys.columns来做到这一点,但是...... SQL不是为整体这种操作而设计的。

DECLARE @sConcat varchar(max) = ''

select  @sConcat = @sConcat +  + c.name + ' = ''TRUE'' OR ' 
from sys.tables t
inner join sys.columns c
    on c.object_id = t.object_id
where t.name = 'MyTable' 
    and c.name like 'COL%';

EXEC (' SELECT ID, CASE WHEN ' + LEFT(@sConcat, LEN(@sConcat)-3) + ' THEN ''TRUE'' ELSE ''FALSE'' END RESULT FROM MyTable ')

使用此结果做您需要的任何事情。我建议你创建你的RESULT列并将它放到INSERT / UPDATE的触发器中。