【问题标题】:Oracle: Can I select from a list of values?Oracle:我可以从值列表中进行选择吗?
【发布时间】:2015-07-22 06:57:08
【问题描述】:

我知道可以像Select * from table where ID in (1,2,3,4) 那样从列表中过滤查询,但是可以从列表中选择吗?

例如,我想从偏移小时列表中选择日期和偏移日期:

select sysdate, sysdate - offset / 24 as offsetSysdate
from dual, (1,2,3,4) as offset

我知道我可以创建一个表并用值填充它来执行此操作,但我正在寻找一种方法来直接在查询中即时执行此操作。

【问题讨论】:

  • 1,2,3,4 只是一个例子,数字不一定是连续的或所有整数。

标签: sql oracle


【解决方案1】:

您可以使用数据库“数字表”类型 - 要么创建一个,要么使用一个像 SYS.KU$_OBJNUMSET 这样容易存在的数据库:

select sysdate, sysdate - offset.column_value / 24 as offsetSysdate
from TABLE (KU$_OBJNUMSET(1,2,3,4)) offset

请注意,上面的offset 现在是TABLE 的别名,并且对于这样的表类型有一个名为column_value 的伪列。也不需要 DUAL 表。

如果您更喜欢创建自己的类型:

create type num_tab as table of number;
/

select sysdate, sysdate - offset.column_value / 24 as offsetSysdate
from TABLE(num_tab(1,2,3,4)) offset;

【讨论】:

  • 谢谢,这个解决方案是最简单的,不需要从预定义的集合中选择或使用联合。
  • 这个解决方案是最灵活的,因为它还允许非连续数字和非整数数字。
  • @Tony Andrews:对于其他类型(例如字符串或日期时间),oracle 中是否有等效的 KU$_OBJNUMSET?或者您会简单地使用您的第二个示例并使其成为所需的类型?
  • 字符串有SYS.KU$_VCNT (TABLE OF VARCHAR2(4000))。我不知道有一个约会。
【解决方案2】:

当然,为此使用子选择

select sysdate, sysdate - offset / 24 as offsetSysdate
from
(
    select 1 as offset from dual
    union
    select 2 from dual
    union
    select 3 from dual
    union
    select 4 from dual
)

有关生成数字序列的更复杂的方法,请参见例如here.


编辑:Brino 想出了建议的代码改进,这里是可读格式并略有改进:

select sysdate, sysdate - offset.value / 24, offset.value as offsetSysdate
from (select r as value
      from (select level r from dual connect by level <= 4)
     ) offset;

【讨论】:

  • 谢谢,使用您的链接我能够创建一个更简单的查询:select sysdate, sysdate - offset.value / 24, offset.value as offsetSysdate from (select r as value from (select level r from dual connect by level &lt;= 100) where r in (1,3,4,5)) offset;
  • @Brino:好的,我会把它复制到我的答案中。
  • @Brino: ...并做了一些小改进
【解决方案3】:

使用 with 子句创建偏移量表:

with offset_table(offset) as
( select level lvl
  from dual
  connect by level <= 4
)
select sysdate, sysdate - offset / 24 as offsetSysdate
from offset_table;

【讨论】:

    猜你喜欢
    • 2012-05-08
    • 2020-07-07
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多