1

重複の可能性:
Oracleでcsvをテーブルに変換する方法

PL/SQL に、変数の入力を "starts-with" フィルターとして処理するように構築されたクエリがあります。

WHERE product_group LIKE strProductGroup || '%'

新しい「機能」として、入力変数にカンマ区切りの値を含めることができます。それで、以前は「ART」のようなものを期待していたところに、「ART、DRM」が表示されるようになりました。

可能であれば、このクエリを文字列として作成し、EXECUTE IMMEDIATE を使用することは避けたいと思います。Oracle 10g で「CSV リストのいずれかの値で始まる」と言うのと同じ WHERE 条件を記述する方法を考えられる人はいますか?

4

2 に答える 2

1

いくつかの追加オブジェクト (コレクション型と関数) の作成に制限がないと仮定すると、リストを解析して、クエリで参照できるコレクションにすることができます。Tom Kyte は変数 "IN" リストスレッドでこれについて良い議論をしています。

たとえば、 Tom のmyTableTypeandin_list関数を使用する場合

SQL> create or replace type myTableType as table 
     of varchar2 (255);
  2  /

Type created.


ops$tkyte@dev8i> create or replace 
     function in_list( p_string in varchar2 ) return myTableType
  2  as
  3      l_string        long default p_string || ',';
  4      l_data          myTableType := myTableType();
  5      n               number;
  6  begin
  7    loop
  8        exit when l_string is null;
  9        n := instr( l_string, ',' );
10         l_data.extend;
11         l_data(l_data.count) := 
                 ltrim( rtrim( substr( l_string, 1, n-1 ) ) );
12         l_string := substr( l_string, n+1 );
13    end loop;
14
15    return l_data;
16  end;
17  /

そうすれば、比較的簡単に等式を検索できます。

WHERE product_group IN (SELECT column_value 
                          FROM TABLE( in_list( strProductGroup )))

LIKEしかし、リスト内でa を実行できないため、少し難しい aを実行したいとしますLIKE。ただし、次のようなことができます

select *
  from emp e,
       (select '^' || column_value search_regexp
          from table( in_list( 'KIN,BOB' ))) a
 where regexp_like( e.ename, a.search_regexp )

これにより、 がまたはで始まるEMP従業員がテーブルから検索されます。デフォルトのテーブルでは、 「KING」である行が 1 行だけ返されます。ENAMEKINBOBSCOTT.EMPENAME

于 2012-09-19T20:30:40.303 に答える
0

アイデアをくれた別の投稿を見つけました。私の特定のケースでは、入力の値はすべて 3 文字になるため、次のことができます。

AND SUBSTR(product_group, 0, 3) IN
    (SELECT regexp_substr(strProductGroup, '[^,]+', 1, LEVEL)
      FROM dual
      CONNECT BY LEVEL <= length(regexp_replace(strProductGroup, '[^,]+')) + 1)

追加の型や関数を必要としないため、このソリューションが気に入っていますが、私の特定のケースにかなり限定されています。

于 2012-09-19T20:35:23.443 に答える