我在数据库中有几列表说有 option1-option15 列的选择。如果用户没有选择它,则列中的数据可以为空,否则它将为“y”。我只需要获取数据所在的那些列'你'。
column_id choice1 choic2 choice3......15
1 null y null
2 y null null
如何使用给定列 ID 的 sql 查询来获取此信息?
您正在尝试以与设计相反的方式使用数据库表。
当您应该根据某些条件从字段中选择数据时,您正在尝试在数据存在时从表中选择字段(列)。此外,当您在系统中添加了另一个选项时会发生什么?我假设您必须更改表格设计和使用表格的所有过程/应用程序才能识别这个新选项。
最好创建一个包含选项作为行的表,然后为用户选择所有行。从您的示例数据(每个用户只选择一个选项)中,您将有两行:
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)
确保用户不能两次选择相同的选项。与具有所有可能选项编号的查找表(或约束)的关系将防止选择无效选项。
您没有指定您使用的 Oracle 版本。但是您可以使用 aUNPIVOT
或 a查询此数据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'
执行此过程可以使数据在一列中轻松访问,而不是在多列中访问。