我有一张表:
+--------+--------+--------+--------+--------+
| 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)。
答案 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 ;