我在数据库中有几列用于表示选项,其中包含option1-option15列。如果用户没有选择它,则列中的数据可以为空,否则它将为'y'。我需要获取这些列数据为'y'的地方。
column_id choice1 choic2 choice3......15
1 null y null
2 y null null
如何使用sql查询获取给定列ID?
答案 0 :(得分:1)
您正试图以与其设计相反的方式使用数据库表。
当您应该根据某些条件从字段中选择数据时,您尝试从表中选择字段(列)。此外,当您在系统中添加了其他选项时会发生什么?我假设您必须使用表格更改表格设计和所有程序/应用程序以识别此新选项。
最好创建一个包含选项为行的表,然后为用户选择所有行。从您的示例数据(每个用户只选择一个选项),您将有两行:
user_id option_number
------- -------------
1 2
2 1
如果用户1要选择更多选项,则添加更多行:
user_id option_number
------- -------------
1 2
1 5
1 10
1 15
2 1
表的主键是(user_id, option_number)
,以确保用户无法两次选择相同的选项。与具有所有可能选项编号的查找表(或约束)的关系将阻止选择无效选项。
答案 1 :(得分:1)
您没有指定您正在使用的Oracle版本。但您可以使用UNPIVOT
或UNION ALL
:
UNPIVOT
版本(参见SQL Fiddle With Demo):
select *
from yourtable
unpivot
(
val
for col in (choice1, choice2, choice3)
) u
where val = 'y'
UNION ALL
版本(参见SQL Fiddle With Demo):
select *
from
(
select columnid, 'choice1' col, choice1 val
from yourtable
union all
select columnid, 'choice2' col, choice2 val
from yourtable
union all
select columnid, 'choice3' col, choice3 val
from yourtable
) x
where val = 'y'
执行此过程,可以在一列而不是多列中轻松访问数据。