oracle 在IN子句中指定逗号分隔值

5cnsuln7  于 2023-03-29  发布在  Oracle
关注(0)|答案(2)|浏览(262)

我在Oracle中编写了以下PL/SQL代码:

declare
    l_today date := sysdate;
    company varchar2(30):='info'; 
    howmany     INTEGER;
    params varchar2(10000):= 'color-1,color-2';

begin
    select count(*) into howmany from toys where colour 
IN (
   'color-1'
    );    
dbms_output.put_line (howmany);
    dbms_output.put_line (params);

exception when others then
    dbms_output.put_line(sqlerrm);
end;

我想通过在变量中指定IN子句的列表开始使begin中的select子句动态化。在上面的params中是一个逗号分隔的字符串,我想在params中做。我尝试了一些方法,但无法实现它。看起来没有简单的方法来做到这一点。
是否有其他方法可以实现这一目标?
我尝试使用一些split和in_list函数,但它们都给出了错误。
我想使用这个功能,我有一个20个字符串的列表要使用。我可以把它们硬编码到in-clause中,或者制作一个变量,然后使用它。

hi3rlvi2

hi3rlvi21#

使用您最喜欢的csv-to-rows conversion方法将列表转换为一系列行。然后检查列是in这些行
例如:

create table toys (
  color varchar2(10)
);

insert into toys values ( 'color-1' );
insert into toys values ( 'color-1' );
insert into toys values ( 'color-2' );
insert into toys values ( 'color-3' );

var in_list varchar2(100)
exec :in_list := 'color-1,color-2';

select * from toys
where  color in (
  select regexp_substr ( :in_list, '[^,]+', 1, level )
  from   dual
  connect by level <= length ( :in_list ) - length ( replace ( :in_list, ',' ) ) + 1
);

COLOR     
----------
color-1
color-1
color-2
eqoofvh9

eqoofvh92#

您可以匹配子字符串(包括周围的分隔符,以便匹配完整的术语):

declare
  howmany INTEGER;
  params  varchar2(10000) := 'color-1,color-2';
begin
  select count(*)
  into   howmany
  from   toys
  where  ',' || params || ',' LIKE '%,' || colour || ',%';
  dbms_output.put_line (howmany);
  dbms_output.put_line (params);
end;
/

也可以创建集合数据类型:

CREATE TYPE string_list IS TABLE OF VARCHAR2(20);

然后在过滤器中使用它:

declare
  howmany INTEGER;
  params  string_list := string_list('color-1', 'color-2');
begin
  select count(*)
  into   howmany
  from   toys
  where  colour MEMBER OF params;
  dbms_output.put_line (howmany);
  FOR i IN 1 .. params.COUNT LOOP
    dbms_output.put_line (params(i));
  END LOOP;
end;
/
  • 注意:捕获OTHERS被认为是不好的做法,因为它会隐藏所有异常。更好的做法是捕获您预期会引发的特定异常,然后意外的异常将导致代码失败并可以调试。*

fiddle

相关问题