oracle 10g IN子句查询

时间:2011-03-23 17:03:50

标签: oracle oracle10g ora-01722

请忽略以下明显的语法缺陷:

我有一个这样的sql作为命名查询:

select saalry from emp where emp_id in (:id)

id的类型为number 我想传入一个逗号分隔的列表,如下所示:

String id = 121,123,456

但我得到ORA-01722: invalid number 如何将逗号分隔的id列表传递给IN子句?

2 个答案:

答案 0 :(得分:2)

假设:id是一个包含相对较短的逗号分隔数字列表的字符串(例如'123,456,789'),这对您来说已经足够了:

select saalry from emp
where INSTR( ',' || :id || ','
           , ',' || TRIM(TO_CHAR(emp_id)) || ','
           ) > 0;

然而,它不会表现得那么好,因为它不太可能在emp_id上使用索引。

答案 1 :(得分:0)

另一种方式来自http://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement

他们的例子是

select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;

可以将其放入in子句

 select * from emp where ename in (
   select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
   connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null );