2016-11-15 4 views
2

私はこのようなOracleで収集していた場合: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; 

私が収集し、カウントをループせずにv_num_dupsdupe発生回数を返すことができますどのように?

v_coll.count('dupe')などの簡単な表現がありますか?

答えて

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; 

出力:私はtboneの答えが好きながら、これはまた、重複を削除するために非常に素晴らしい作品

dupe 
not dupe 
+0

はすごい、これは素晴らしいです...以前に追加された最後の値を指すようになります。私はあなたが*重複した値を望むならば、それは悪いと思うが、そうでなければ、これはすばらしい!ありがとうございました!!! –

0

残念ながら、少なくとも11gはありません。 コレクションを手動で繰り返し、カウントを実行する必要があります。

0

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; 
+1

それは素晴らしいですが、大きなボリュームで非常に遅い... ;-) tbone(私が思う最良の方法)によって提案された方法を使用しているときは、ヌル値に注意してください。 nullをキーとして割り当てると、ループが正しく機能しなくなります。 – Rusty

関連する問題