从列表中作为虚拟列的虚拟值

时间:2017-08-15 15:51:28

标签: sql oracle

我想向虚拟列提供一个id列表。这将有助于我识别表中没有的那些ID。 示例:我想在下面用' WITH'生成硬编码数据集。条款

ID
12345
23456
34567

这可能在Oracle中实现吗?

2 个答案:

答案 0 :(得分:6)

你可以使用一个集合;如果您的条目少于32k,则built-in ODCINumberList会执行:

select * from table(sys.odcinumberlist(12345, 23456, 34567));

COLUMN_VALUE
------------
       12345
       23456
       34567

如果您愿意,可以作为CTE:

with cte (id) as (
  select * from table(sys.odcinumberlist(12345, 23456, 34567))
)
select * from cte;

        ID
----------
     12345
     23456
     34567

只要您只需要一个维度,它就比维护大量union all语句容易一些。它也可以作为集合从应用程序层传递给查询或过程 - 例如,您可以将Java数组转换为通过JDBC传递的集合。

但是如果你有很多值,那些在运行时没有被某些外部机制提供的话,那么它们应该在某个地方的某个表中。

答案 1 :(得分:3)

这样做你想要的吗?

with ids as (
      select 12345 as id from dual union all
      select 23456 from dual union all
      select 34567 from dual
     )
select ids.*
from ids;

还有其他方法可以表达这一点。但是,简单union all是简短列表的最简单方法。