SQL查询以获取列名称(如果它具有特定值)

SQL查询以获取列名称(如果它具有特定值),sql,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”或“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 | | 所以我需要知道,所有的sub都是什么,对于一个特定的名字都有“Y”标志。 例如:

如果选择,则需要在查询输出中获取“Y”列名的列表

Tom Subs ____ sub-1 sub-3 sub-4 sub-6
非常感谢您的帮助。

不知何故,我已接近解决方案。我可以得到所有行。我只用了两列

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”值的列名。

我在这里根据一些假设回答这个问题。首先,您知道相关表的列的名称。第二,这是SQL Server。Oracle和MySql有实现这一点的方法,但我不知道其语法

不管怎样,我要做的是对数据执行“UNPIVOT”

那里有很多偏执狂,所以我来解释一下。实际的“unpivot”语句别名为UNPVT,它获取数据并将列扭曲成行,与之关联的SELECT提供返回的数据。这里我使用了'Name',并将列名放在'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' 

下面的代码适用于我

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'

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

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

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'
将联接条件包括为


on name=Tom

尝试从信息模式中选择列名称。表名称如“Table name”的列您的数据库需要修复。如果您有列,则需要行。我们不能将这些行作为列,因为该名称将每日创建。@达吉吉-我尝试过它不起作用,您能给我一个相同的查询吗?您使用哪些DBMS?考虑改进您的答案。你的具体问题相当不清楚。请使用包含所有常用元素主语、前置词、宾语的完整英语句子,您可能会得到以下答案:-