2017-02-21 5 views
-3

私は、PL/SQLプロシージャの文字列としてコンマ区切りリストを持っています。私はPL/SQLカンマ区切りリスト。 dupsを削除して配列に入れます

  1. 削除が
  2. 配列のリストを入れを複製する必要があります。

私はどちらかを行うための複数の方法を見つけましたが、両方ではありません。 ヘルプがありますか?

+3

あなたが各部分を行う方法を知っているなら、それらを一緒に組み合わせることはなぜ問題ですか? –

+0

あなたは試したことを試してみてください。 – XING

+0

問題は重複を除去するための方法が少し信頼できないようです。いくつかの例を実行すると、全く動作しないか、間違った設定を与えたり、カンマを残したりします。 (私は私が排除することができると思う)。それらの大部分は、リストから配列へ行くために、ある形式または別の配列の配列を使用しますが、それらの配列型は、重複除去テクニックには役立ちません。ありがとう! –

答えて

1

コンマ区切りのリストを行に変換するためのよく知られたSQLのトリックがあります。そのトリックを使用して、DISTINCTというキーワードを追加し、BULK COLLECTの結果を配列に追加してください(私はあなたがコレクションを意味すると思います)。

DECLARE 
    p_test_string VARCHAR2 (4000) := 'A,B,C,B,B,D'; 

    TYPE string_array_type IS TABLE OF VARCHAR2 (4000); 

    l_array   string_array_type; 
BEGIN 
    SELECT DISTINCT REGEXP_SUBSTR (p_test_string, 
         '[^,]+', 
         1, 
         LEVEL) 
    BULK COLLECT INTO l_array 
    FROM DUAL 
    CONNECT BY REGEXP_SUBSTR (p_test_string, 
          '[^,]+', 
          1, 
          LEVEL) 
       IS NOT NULL 
    ORDER BY 1; 

    DBMS_OUTPUT.put_line ('l_array.count = ' || l_array.COUNT); 
    DBMS_OUTPUT.put_line ('l_array(2) = ' || l_array (2)); 
END; 

出力:

l_array.count = 4 
l_array(2) = B 
+0

ありがとう!働いた!私よりも知っている人は、重複しないように、良い文字列パッケージを作成する必要があります。 –

+0

これをライブラリにしたい場合は、広く使用するために、MT0のソリューションを実装する必要があります(これについてはupvoteします)。 PL/SQLの純粋なアプローチははるかに高速です(恐らく20〜30倍速く)。これを数回だけ呼び出すのであれば、シンプルさのために投稿したアプローチを好むでしょう。あなたがこれを何百万回も呼び出すのであれば、それを図書館にしていれば、私はMT0の解決策に賛成です。 –

1

split a delimited stringに複数の方法があります。

CREATE TYPE string_list IS TABLE OF VARCHAR2(4000); 
/

CREATE OR REPLACE FUNCTION split_String(
    i_str IN VARCHAR2, 
    i_delim IN VARCHAR2 DEFAULT ',' 
) RETURN STRING_LIST DETERMINISTIC 
AS 
    p_result  STRING_LIST := STRING_LIST(); 
    p_start  NUMBER(5) := 1; 
    p_end   NUMBER(5); 
    c_len CONSTANT NUMBER(5) := LENGTH(i_str); 
    c_ld CONSTANT NUMBER(5) := LENGTH(i_delim); 
BEGIN 
    IF c_len > 0 THEN 
    p_end := INSTR(i_str, i_delim, p_start); 
    WHILE p_end > 0 LOOP 
     p_result.EXTEND; 
     p_result(p_result.COUNT) := SUBSTR(i_str, p_start, p_end - p_start); 
     p_start := p_end + c_ld; 
     p_end := INSTR(i_str, i_delim, p_start); 
    END LOOP; 
    IF p_start <= c_len + 1 THEN 
     p_result.EXTEND; 
     p_result(p_result.COUNT) := SUBSTR(i_str, p_start, c_len - p_start + 1); 
    END IF; 
    END IF; 
    RETURN p_result; 
END; 
/

これは、単純な文字列関数を使用して、純粋なPL/SQLファンクション(というより高価な正規表現とコンテキストを使用するよりは、SQLスコープにスイッチ)である:の一つは、単純なPL/SQL機能を使用することです。

非常に、シンプルなビルトイン、コレクションから重複を除去する機能SET(collection_value)もあります:

SET(STRING_LIST('A', 'B', 'A', 'C', 'B')) 

コレクションを与える:だから

STRING_LIST('A', 'B', 'C') 

、分割したい場合は、区切られた文字列と重複しないようにすることができます。

これはあなたに与えるでしょう:

STRING_LIST('A', 'B', 'C', 'D', 'E') 
関連する問題