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`).

我相信可以制作类似的东西procedurefunctions解决这个目的。
我只想知道我怎样才能做到这一点。
谢谢

4

2 回答 2

2

目前还不清楚 ArrayList 到底是什么意思;您是在谈论 C#/Java/这里的任何类型(因为 Oracle PL/SQL 没有泛型)?

无论如何,这是将 PL/SQL 中的逗号分隔列表转换为 PL/SQL 表并将其用于 IN 搜索的一种方法:

(见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 回答