2011-03-23 109 views
1

请忽略以下明显的语法缺陷:Oracle 10g的IN子句查询

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

select saalry from emp where emp_id in (:id) 

ID是型号 我想在传递一个逗号分隔的列表如下:

String id = 121,123,456 

但我正在逐渐ORA-01722: invalid number 我如何传递一个逗号分隔的ID列表,我的条款?

+2

你说'id为类型number',但你将它作为一个字符串传递。 – Sathya 2011-03-26 06:20:11

回答

2

假设:id是包含数字的相对短的逗号分隔的列表(例如'123,456,789'),这可能对您足够的字符串:

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

它不会然而执行,以及,因为它不太可能使用emp_id上的索引。

+0

谢谢,它为我工作 – 2011-08-04 13:23:36

+1

答案是够好的,虽然我会使用集合和TABLE运算符,因此可以使用索引。 – 2011-08-11 15:16:35

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; 

可以在子句中放入

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);