如果值为1,则获取行的列名称

时间:2015-03-05 19:26:43

标签: sql oracle jsp

我有一张表:

+--------+--------+--------+--------+--------+
| Class  | Skill1 | Skill2 | Skill3 | Skill4 |
+--------+--------+--------+--------+--------+
| Strong |      1 |      0 |      0 |      0 |
| Tough  |      0 |      1 |      1 |      0 |
| Smart  |      0 |      0 |      0 |      1 |
+--------+--------+--------+--------+--------+

我试图在另一个页面上动态创建一个选择下拉列表(这不是问题)。我想要一个Oracle SQL语句,它可以选择指定行中包含1的所有列的列名。

实施例: 我选择Strong课程,想知道我可以使用哪些技能。所以我需要一个SQL语句,它只给出我在字段中只有强行的列名称1。 对于此示例,它应该返回(Skill1)。

2 个答案:

答案 0 :(得分:3)

我建议您更改数据库结构 - 如果您需要添加其他技能,那么您将不得不继续添加新列。考虑创建一个skills表,然后通过另一个表将这些表与类相关联。那时,它是一个简单的select语句。

但是,如果在您的情况下不是一个选项,使用您当前设计的一个选项是使用union all

select skill
from (
    select class, case when skill1 = 1 then 'Skill1' end Skill
    from yourtable
    union all 
    select class, case when skill2 = 1 then 'Skill2' end Skill
    from yourtable
    union all 
    select class, case when skill3 = 1 then 'Skill3' end Skill
    from yourtable
) t
where class = 'Strong' and skill is not null

答案 1 :(得分:1)

您可以使用unpivot,然后执行一个简单的查询,其中class = Strong且技能= 1:

with t( Class  , Skill1 , Skill2 , Skill3 , Skill4 ) as 
(
select  'Strong' ,      1 ,      0 ,      0 ,      0 from dual union all
select  'Tough'  ,      0 ,      1 ,      1 ,      0 from dual union all 
select  'Smart'  ,      0 ,      0 ,      0 ,      1  from dual ) -- Sample data
select skills from (
select * from t
unpivot( 
skill for skills in (Skill1 , Skill2 , Skill3 , Skill4)
) ) where class = 'Strong' and skill = 1 ;