如何在oracle中比较两个collection值?

时间:2019-11-24 13:58:11

标签: oracle collections user-defined-types

假设在一个集合(嵌套集合)中,我具有值(1、2、3、4、5),在另一个集合b中,我具有值(5、6、7、8、9)。在这两个集合中,5是常见的。如何比较并返回5?

2 个答案:

答案 0 :(得分:2)

假设您的意思是“收藏” Nested Table,则只需使用

TYPE NumberArray IS TABLE OF INTEGER;    
ret := NumberArray(1,2,3,4,5) MULTISET INTERSECT NumberArray(5,6,7,8,9);

还要检查其他一些Multiset OperatorsMultiset Conditions

如果您只需要“比较”(即“是否等于”),则只需使用

IF NumberArray(1,2,3,4,5) = NumberArray(5,6,7,8,9) THEN ...

答案 1 :(得分:0)

对于集合,您可以使用MULTISET INTERSECT运算符:

CREATE TYPE intlist IS TABLE OF int;

DECLARE
  a intlist := intlist(1,2,3,4,5);
  b intlist := intlist(5,6,7,8,9);
  c intlist;
BEGIN
  c := a MULTISET INTERSECT b;

  FOR i in 1 .. c.COUNT LOOP
    DBMS_OUTPUT.PUT( c(i) || ',' );
  END LOOP;
  DBMS_OUTPUT.NEW_LINE();
END;
/

输出:

5,
  

我需要使用循环比较每个值。

遍历一个数组,然后使用MEMBER OF运算符检查每个元素是否在另一个数组中:

DECLARE
  a intlist := intlist(1,2,3,4,5);
  b intlist := intlist(5,6,7,8,9);
  c intlist;
BEGIN
  c := intlist();
  FOR i IN 1 .. a.COUNT LOOP
    IF a(i) MEMBER OF b THEN
      c.EXTEND;
      c(c.COUNT) := a(i);
    END IF;
  END LOOP;

  FOR i IN 1 .. c.COUNT LOOP
    DBMS_OUTPUT.PUT( c(i) || ',' );
  END LOOP;
  DBMS_OUTPUT.NEW_LINE();
END;
/

还输出:

5,

db<>fiddle