【问题标题】:Oracle's analogue for unnest array from PostgreSQLOracle 对来自 PostgreSQL 的 unnest 数组的模拟
【发布时间】:2015-04-03 21:15:04
【问题描述】:

我有一个带有子网的表

cidr | ip

我想通过所属 ips 列表选择子网。在 postgres 中我可以这样做:

select 
    ips.ip, net.uid, net.cidr 
from 
    TBL_SID_SUBNETWORK net, 
    (select unnest(ARRAY[1,2,3]) ip) ips 
where 
    cast (((2^net.cidr) - 1) as bigint)<<(32 - net.cidr) & ips.ip =  net.ipaddress

在 postgres 中,我可以传递数组并将其用作表格。

select ips.ip from
(select unnest(ARRAY[1,2,3]) ip) ips

|ip|
 1
 2
 3

是否可以在 Oracle 中做类似的事情?在一个查询中?我不想创建、填充和删除额外的表,因为我间接使用 DB,事务由应用程序配置管理。

我知道 Oracle 的 TABLE(collection) 函数与我想要的功能相同。但是我不能将collection传递给这个查询,因为我应该在之前声明和填充collection,这样就和创建临时表一样。

【问题讨论】:

  • TABLE 的问题只是你不想定义一个集合吗?如果是这样,您可以使用预定义的、记录在案的集合。例如:select column_value ip from table(sys.odcinumberlist(1,2,3));
  • 嗨,@JonHeller 是的,您的解决方案效果很好。谢谢!

标签: sql oracle postgresql unnest


【解决方案1】:

Oracle 具有您可以使用的预定义、记录在案的集合。例如:

select column_value ip from table(sys.odcinumberlist(1,2,3));

没有一个地方包含所有记录集合的列表。 Database Data Cartridge Developer's GuideThis page 列出了一些比较流行的,例如ODCIVarchar2ListODCINumberListODCIDateList。此外,Lukas Eder 的 this answer 使用查询来查找系统集合,尽管并非所有这些集合都记录在案。

如果 Oracle 只提供一些标准集合供大家使用并给它们起好听的名字,那就太好了。使用sys.odcinumberlist 是安全的,但它看起来很丑陋。

【讨论】:

  • 您是否有任何其他记录在案的收藏的链接?
  • @redbmk 我用一些新信息更新了我的答案。
  • 谢谢! Oracle 的方式确保让 postgreSQL 的 unnest 看起来更愉快
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多