sql查询获取多列的数据

时间:2012-10-10 11:27:07

标签: sql oracle

我在数据库中有几列用于表示选项,其中包含option1-option15列。如果用户没有选择它,则列中的数据可以为空,否则它将为'y'。我需要获取这些列数据为'y'的地方。

column_id choice1 choic2 choice3......15

   1         null  y      null
   2         y     null   null

如何使用sql查询获取给定列ID?

2 个答案:

答案 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版本。但您可以使用UNPIVOTUNION 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'

执行此过程,可以在一列而不是多列中轻松访问数据。