如果列名具有特定值,则使用SQL查询获取列名

时间:2016-04-05 03:42:25

标签: sql

我有一个情况,我有一个表格,其中一个标志分配给列名称(如'Y'或'N')。如果有一个特定的值,我必须选择一行的列名。

我的表:

Name|sub-1|sub-2|sub-3|sub-4|sub-5|sub-6|
-----------------------------------------
Tom | Y   |     | Y   | Y   |     | Y   |
Jim | Y   |  Y  |     |     | Y   | Y   |
Ram |     |  Y  |     | Y   | Y   |     |

所以我需要得到,所有潜艇都有特定名称的'Y'标志。 例如:

如果我选择

Tom
,我需要在查询输出中获取“Y”列名称列表。

Subs
____
sub-1
sub-3
sub-4
sub-6

非常感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

下面的代码适用于我。

select t.Subs from (select name, u.subs,u.val
from TableName s
unpivot
(
  val
  for subs  in (sub-1, sub-2, sub-3,sub-4,sub-5,sub-6,sub-7)
) u where u.val='Y') T
where t.name='Tom'

答案 1 :(得分:1)

问题是您的数据库模型未规范化。如果它被正确规范化,查询将很容易。因此,解决方法是“动态”规范化模型,以便能够进行查询:

select col_name
from (
   select name, sub_1 as val, 'sub_1' as col_name
   from the_table
   union all
   select name, sub_2, 'sub_2'
   from the_table
   union all
   select name, sub_3, 'sub_3'
   from the_table
   union all
   select name, sub_4, 'sub_4'
   from the_table
   union all
   select name, sub_5, 'sub_5'
   from the_table
   union all
   select name, sub_6, 'sub_6'
   from the_table
) t
where name = 'Tom'
and val = 'Y'

以上是标准SQL,应该适用于任何(关系型)DBMS。

答案 2 :(得分:0)

不知何故,我接近解决方案。我可以获得所有行。 (我只使用了2列)

select col from ( select col, case s.col when 'sub-1' then sub-1 when 'sub-2' then sub-2 end AS val from mytable cross join ( select 'sub-1' AS col union all select 'sub-2' ) s ) s where val ='Y'

它给出了所有行的列。我需要一行的相同数据。就像我选择" Tom",我需要' Y'的列名。值。

答案 3 :(得分:0)

我在这里做了几个假设来回答这个问题。首先是你知道有问题的表的列的名称。其次,这是SQL Server。 Oracle和MySql有办法执行此操作,但我不知道其语法。

无论如何,我所做的就是表演“不安全”。关于数据。

那里有很多说法,所以要解释一下。实际的' unpivot' statement(别名为UNPVT)获取数据并将列转换为行,与之关联的SELECT提供正在返回的数据。我在这里使用了'名称',并将列名放在' Subs'列和相应的值进入' Val'柱。确切地说,我正在谈论上述代码的这一方面:

SELECT [Name], [Subs], [Val]
   FROM 
      (SELECT [Name], [Sub-1], [Sub-2], [Sub-3], [Sub-4], [Sub-5], [Sub-6]
          FROM pvt) p
   UNPIVOT
      (Orders FOR [Name] IN 
           ([Name], [Sub-1], [Sub-2], [Sub-3], [Sub-4], [Sub-5], [Sub-6])
   )AS unpvt 

我的下一步是做出一个'子选择'在哪里我可以找到被追捕的具体名称和val。这将为您提供一个沿着这些行看起来的SQL语句

SELECT [Name], [Subs], [Val]
   FROM (
      SELECT [Name], [Subs], [Val]
      FROM 
        (SELECT [Name], [Sub-1], [Sub-2], [Sub-3], [Sub-4], [Sub-5], [Sub-6]
          FROM pvt) p
      UNPIVOT
         (Orders FOR [Name] IN 
              ([Name], [Sub-1], [Sub-2], [Sub-3], [Sub-4], [Sub-5], [Sub-6])
         )AS unpvt 
) AS pp 
WHERE 1 = 1 
   AND pp.[Val] = 'Y'
   AND pp.[Name] = 'Tom' 

答案 4 :(得分:-1)

select col from (
   select col,
       case s.col
         when 'sub-1' then sub-1
         when 'sub-2' then sub-2
         when 'sub-3' then sub-3
         when 'sub-4' then sub-4
         when 'sub-5' then sub-5
         when 'sub-6' then sub-6
       end AS val
   from mytable
   cross join
   (
    select 'sub-1' AS col union all
    select 'sub-2' union all
    select 'sub-3' union all
    select 'sub-4' union all
    select 'sub-5' union all
    select 'sub-6'

   ) s on name="Tom"
) s
where val ='Y'

将加入条件包括为

在名称=“ Tom”上