2011-03-23 89 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);