ORACLE - 如何计算集合中成员的出现次数?

时间:2016-11-15 20:43:38

标签: oracle collections count

如果我在Oracle中有这样的集合:

DECLARE
    TYPE v_type IS TABLE OF varchar2(4000);
    v_coll v_type := v_type();
    v_num_dups NUMBER;
BEGIN
    v_coll.extend();
    v_coll(1):= 'not dupe';
    v_coll.extend();
    v_coll(2):= 'dupe';
    v_coll.extend();
    v_coll(3):= 'dupe';

    for i in 1..v_coll.count loop
        dbms_output.put_line(v_coll(i));
    end loop;

END;

如何在不循环收集和计算的情况下将dupe次出现的次数返回v_num_dups

是否有一些简单的方式来说v_coll.count('dupe')或类似的东西?

3 个答案:

答案 0 :(得分:1)

如果您想完全避免重复,可以使用关联数组。类似的东西:

DECLARE
    TYPE v_type IS TABLE OF number index by varchar2(4000);
    v_coll v_type;
    idx varchar2(4000);
BEGIN
    v_coll('not dupe'):= 1;
    v_coll('dupe'):= 1;
    v_coll('dupe'):= 1;

    -- show key values 
    idx := v_coll.first;
    loop
      exit when idx is null;
      dbms_output.put_line(idx);
      idx := v_coll.next(idx);
    end loop;

END;

输出:

dupe
not dupe

答案 1 :(得分:0)

不幸的是,没有(至少11g)。 您必须手动迭代集合并执行计数。

答案 2 :(得分:0)

虽然我喜欢tbone的答案,但这也非常适合删除重复项:

DECLARE
    TYPE v_type IS TABLE OF varchar2(4000);
    v_coll v_type := v_type();
    v_num_dups NUMBER;
BEGIN
    v_coll.extend();
    v_coll(1):= 'not dupe';
    v_coll.extend();
    v_coll(2):= 'dupe';
    v_coll.extend();
    v_coll(3):= 'dupe';

    v_coll:=SET(v_coll); --<----remove dups!

    dbms_output.put_line(cardinality(v_coll));

    for i in 1..v_coll.count loop
        dbms_output.put_line(v_coll(i));
    end loop;

END;