如果列等于某事,如何复制列名

时间:2017-05-23 15:54:15

标签: sql sql-server sql-server-2008

我想

  1. 如果列为1,则复制列名称(到新列)。例如,对于ID 1,Name1为1,然后我们复制' Name1' (到' Name'列)。否则,什么也不做。
  2. 如果两列(Name1,Name2)都是1,那么每个名称将有两行。例如,ID 3。

    Input
    
    ID Name1 Name2 
    1   1    0
    2   0    1
    3   1    1
    
    Output
    
    ID Name
    1  Name1
    2  Name2
    3  Name1
    3  Name2
    
  3. 我需要一些高级关键字吗?

4 个答案:

答案 0 :(得分:2)

您应该能够使用UNPIVOT函数来获得结果。这会将您的列转换为行,然后您可以根据原始列的值是0还是1来过滤最终结果:

select Id, Name
from <yourtable>
unpivot
(
  value for
  name in (Name1, Name2)
) u
where value <> 0

这是demo

答案 1 :(得分:1)

一种方法是使用union all

select id,
    'Name1' as name
from your_table
where name1 = 1

union all

select id,
    'Name2' as name
from your_table
where name2 = 1

如果列数更多,您还可以使用cross apply

select t.id, x.name
from your_table t
cross apply (
    values (case when t.name1 = 1 then 'Name1' end),
           (case when t.name2 = 1 then 'Name2' end),
           (case when t.name3 = 1 then 'Name3' end)
) x (name)
where x.name is not null;

Demo

答案 2 :(得分:1)

您可以使用交叉申请并按以下方式获取:

select Id, nam as [Name] from #yournames
cross apply ( values (name1, 'name1'),(name2, 'name2')) v(n, nam)
where n = 1

输出:

+----+-------+
| Id | Name  |
+----+-------+
|  1 | name1 |
|  2 | name2 |
|  3 | name1 |
|  3 | name2 |
+----+-------+

答案 3 :(得分:0)

如果只有3列,请使用union

select id, 'Name1' as Name from Input where Name1=1
union all
select id, 'Name2' as Name from Input where Name2=1