oracle 10g IN запрос пункта

Пожалуйста, игнорируйте очевидные недостатки синтаксиса в следующем:

У меня есть SQL, как это как именованный запрос:

select saalry from emp where emp_id in (:id)

id имеет номер типа, который я хотел передать в списке через запятую, например так:

String id = 121,123,456

Но я получаю ORA-01722: invalid numberКак передать разделенный запятыми список идентификаторов в мое предложение IN?

2 ответа

Решение

Если предположить, :id строка, содержащая относительно короткий список чисел, разделенных запятыми (например, '123,456,789'), этого может быть достаточно для вас:

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

Однако он не будет работать так же, поскольку вряд ли будет использовать индекс emp_id,

Есть еще один способ, который можно 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 );
Другие вопросы по тегам