2011-03-23 7 views
1

아래에 명백한 구문의 결함을 무시하십시오오라클 10g

을 내가 명명 된 쿼리로이 같은 SQL이 있습니다

select saalry from emp where emp_id in (:id) 

ID가 유형 번호 이다 내가 전달하고 싶었다 이 같은 쉼표로 구분 된 목록 :

String id = 121,123,456 

하지만 쉼표 내 IN 절에 ID의 목록을 분리 전달할 수 있습니다 어떻게 ORA-01722: invalid number 는 무엇입니까?

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

그것은 이후, 그러나뿐만 아니라 수행하지 않습니다 :

+2

은 당신이 말하는 것입니다 http://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement

에서 또 다른 방법이있다'ID가 형 number'입니다 만 당신은 문자열로 전달하고 있습니다. – Sathya

답변

2

숫자의 상대적으로 짧은 쉼표로 구분 된 목록 (예 : '123,456,789'을)이 당신을 위해 충분한 수를 포함하는 문자열은 :id입니다 가정 emp_id에 대한 색인을 사용하지 않을 것입니다.

+0

고마워, 저를 위해 일했습니다 –

+1

인덱스와 인덱스를 사용할 수 있도록 컬렉션과 테이블 연산자를 사용 하겠지만 대답은 충분합니다. –

0

는 그들의 예 절에 투입 할 수

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