Oracle10g中新的多重集运算符解析
2007-05-09 12:11:49 来源:WEB开发网你还可以使用CARDINALITY 函数来得到某个嵌套表中元素的个数。
select cardinality(num) from num_tab;
CARDINALITY(NUM)
----------------
5
3
3
数据库认为不存在重复值的嵌套表是一个SET。事实上,存在函数SET ,它可以通过删除嵌套表中重复的数据从而将一个嵌套表转化成一个SET。同样还有一个新的 SQL 子句——IS A SET,在嵌套表中不存在重复值的时候返回真值。
select num from num_tab where num is a set;
NUM
--------------------------
NUM_TAB_TYP(1, 2, 3, 4, 5)
NUM_TAB_TYP(1, 3, 5)
NUM_TAB_TYP(2, 4, 6)
select num from num_tab where num multiset union num_tab_typ(1) is a set;
NUM
--------------------------
NUM_TAB_TYP(2, 4, 6)
现在你也可以使用IS EMPTY 这个新的SQL 子句来判断嵌套表中的值是否为空。.
select num from num_tab where num multiset intersect
num_tab_typ(1) is empty;
NUM
--------------------------
NUM_TAB_TYP(2, 4, 6)
除此之外,还有另外一个新的 SQL 子句,是用于判断某个值是否是一个嵌套表的成员。如下例所示:
select num from num_tab where 3 member of num;
NUM
--------------------------
NUM_TAB_TYP(1, 2, 3, 4, 5)
NUM_TAB_TYP(1, 3, 5)
select num from num_tab where 3 not member of num;
NUM--------------------------
NUM_TAB_TYP(2, 4, 6)
你也可以通过使用 SUBMULTISET 来判断一个嵌套表是否是一个多重集的子集。
select num from num_tab where num_tab_typ(1,3,5) submultiset of num;
NUM
--------------------------
NUM_TAB_TYP(1, 2, 3, 4, 5)
NUM_TAB_TYP(1, 3, 5)
最后,还有一个非常有趣的函数——POWERMULTISET ,它可以得到某个给定的多重集的所有子集。下面给出了关于这个函数的一个例子:create or replace type num_tab_tab_typ as table of num_tab_typ;
你还可以使用 POWERMULTISET_BY_CARDINALITY 来约束 POWERMULTISET 函数的返回结果,最后的结果必须满足其包含元素的个数等于某个指定的值。还是以上面的那个例子为例,下面有一段代码,功能是返回所有只包含了两个元素的子集。
/
show errors;
select cast(powermultiset(num) as num_tab_tab_typ) from num_tab
where num = num_tab_typ(2,4,6);
CAST(POWERMULTISET(NUM)ASNUM_TAB_TAB_TYP)
--------------------------
NUM_TAB_TAB_TYP(NUM_TAB_TYP(2), NUM_TAB_TYP(4), NUM_TAB_TYP(2, 4),
NUM_TAB_TYP(6), NUM_TAB_TYP(2, 6),
NUM_TAB_TYP(4, 6), NUM_TAB_TYP(2, 4, 6))select cast(powermultiset_by_cardinality(num,2) as num_tab_tab_typ) num
from num_tab
where num = num_tab_typ(2,4,6);
NUM
--------------------------
NUM_TAB_TAB_TYP(NUM_TAB_TYP(2, 4), NUM_TAB_TYP(2, 6), NUM_TAB_TYP(4, 6))
更多精彩
赞助商链接