0

と がありarraylist of Stringsますstring which is the csv format of this list
このリストに基づいて結果を絞り込む SQL クエリを書きたいと思います。だから、私は次のようなものが欲しい---

select * from table_name where name in (`ArrayList<String> values` or `csv format string`).

procedureなどでfunctions目的を解決できると思います。
どうすればこれを達成できるか知りたいだけです。
ありがとう

4

2 に答える 2

2

ArrayList が正確に何を意味するのかは不明です。ここで C#/Java/whatever 型について話しているのですか (Oracle PL/SQL には Generics がないため)。

とにかく、PL/SQLのコンマ区切りリストをPL/SQLテーブルに変換し、IN検索に使用する1つの方法を次に示します。

( AskTomを参照)

CREATE OR REPLACE TYPE STRINGLISTT as table of varchar2(4000);

create or replace function in_list(p_string    in varchar2,
                       p_delimiter in varchar2) return StringListT is
        l_string long default p_string || p_delimiter;
        l_data   StringListT := StringListT();
        n        number;
      begin
        loop
          exit when l_string is null;
          n := instr(l_string,
                     p_delimiter);
          l_data.extend;
          l_data(l_data.count) := ltrim(rtrim(substr(l_string,
                                                     1,
                                                     n - 1)));
          l_string := substr(l_string,
                             n + 1);
        end loop;      
        return l_data;      
      end;

使用法:

  select * from my_tab t where t.name in 
   (select * from table(in_list('A,B', ',')));
于 2012-06-14T06:46:02.357 に答える
1

私があなたを正しく理解しているなら、あなたは試すことができます:

declare
  v_al  arrayList := new arrayList('11', '22', '33');
  v_csv varchar2(32767) := '111,222,333,444';

  i number;
begin

  select count(*)
    into i
    from table_name
   where val in (select column_value from table(v_al))
      or val in (select distinct regexp_substr(v_csv, '[^,]+', 1, level) token
                   from dual
                 connect by level <= regexp_count(v_csv, ',') + 1);

  dbms_output.put_line(i);

end;

この例では使用count(*)しましたが、必須ではありません (カーソルまたは SQL クエリとしても使用できます)。

ここにフィドルがあります(SQLのみを使用)

于 2012-06-14T08:17:43.777 に答える