Oracle 对来自 PostgreSQL 的 unnest 数组的模拟
Oracle's analogue for unnest array from PostgreSQL
我有 table 个子网,例如
cidr | ip
我想 select 通过所属 ip 列表划分子网。在 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 中,我可以传递数组并将其用作 table。
select ips.ip from
(select unnest(ARRAY[1,2,3]) ip) ips
|ip|
1
2
3
是否可以在 Oracle 中执行类似的操作?在一个查询中?我不想创建、填充和删除额外的 table,因为我间接使用 DB,并且事务由应用程序配置管理。
我知道 Oracle 的 TABLE(collection)
函数,它的作用与我想要的完全相同。但是我不能将集合传递到这个查询中,因为我应该在之前声明和填充集合,这样它与创建临时文件相同 table.
Oracle 具有您可以使用的预定义、记录的集合。例如:
select column_value ip from table(sys.odcinumberlist(1,2,3));
没有一个地方包含所有文档化集合的列表。 This page of the Database Data Cartridge Developer's Guide lists some of the more popular ones, such as ODCIVarchar2List
, ODCINumberList
, and ODCIDateList
. Also, this answer Lukas Eder 使用查询来查找系统集合,尽管并非所有集合都被记录在案。
如果 Oracle 只是提供一些标准集合供大家使用并给它们起个好听的名字就好了。使用 sys.odcinumberlist
是安全的,但它看起来像一个丑陋的 hack。
我有 table 个子网,例如
cidr | ip
我想 select 通过所属 ip 列表划分子网。在 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 中,我可以传递数组并将其用作 table。
select ips.ip from
(select unnest(ARRAY[1,2,3]) ip) ips
|ip|
1
2
3
是否可以在 Oracle 中执行类似的操作?在一个查询中?我不想创建、填充和删除额外的 table,因为我间接使用 DB,并且事务由应用程序配置管理。
我知道 Oracle 的 TABLE(collection)
函数,它的作用与我想要的完全相同。但是我不能将集合传递到这个查询中,因为我应该在之前声明和填充集合,这样它与创建临时文件相同 table.
Oracle 具有您可以使用的预定义、记录的集合。例如:
select column_value ip from table(sys.odcinumberlist(1,2,3));
没有一个地方包含所有文档化集合的列表。 This page of the Database Data Cartridge Developer's Guide lists some of the more popular ones, such as ODCIVarchar2List
, ODCINumberList
, and ODCIDateList
. Also, this answer Lukas Eder 使用查询来查找系统集合,尽管并非所有集合都被记录在案。
如果 Oracle 只是提供一些标准集合供大家使用并给它们起个好听的名字就好了。使用 sys.odcinumberlist
是安全的,但它看起来像一个丑陋的 hack。