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 | | 所以我需要知道,所有的sub都是什么,对于一个特定的名字都有“Y”标志。 例如: 如果选择,则需要在查询输出中获取“Y”列名的列表 Tom Subs ____ sub-1 sub-3 sub-4 sub-6SQL查询以获取列名称(如果它具有特定值),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 | |
非常感谢您的帮助。不知何故,我已接近解决方案。我可以得到所有行。我只用了两列
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?考虑改进您的答案。你的具体问题相当不清楚。请使用包含所有常用元素主语、前置词、宾语的完整英语句子,您可能会得到以下答案:-