2017-02-02 10 views
0

안녕에 작은 따옴표 쉼표 쉼표를 교체하는 방법 나는이있는 모든 곳에 나는 그들이 ('1,2,3') 아래에 있지만 실행하는 것처럼 표시 매개 변수에 값을 통과 할 때SQLIN 절

select * from table1 
where colum1 IN (?parameter) 

아래 같은 절 값을 ('1','2','3') 으로 변경해야하는 쿼리는 IN 절의 쉼표를 작은 따옴표 쉼표로 직접 바꿀 수있는 방법입니까?

+0

이렇게하는 간단한 방법은 없습니다. 당신이 생각하고있는 것은 입력 문자열을 여러 개의 개별 문자열로 된 목록 (컬렉션, 배열, 원하는대로 호출)이 아닌 다른 단일 문자열로 바꿀 것입니다. "입력 문자열을 개별 토큰으로 분할해야합니다. 이 사이트에서 "split csv"에 대한 내용을 읽으십시오. 질문은 여러 번 묻습니다. – mathguy

+1

나는 Oracle과 잘 어울리지 않지만, 이것과 같은 것이 아닙니까? [쉼표로 구분 된 문자열을 분리하고 select 문의 IN 절로 전달하는 방법] (https://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement) –

답변

1

like를 사용하여 당신이 원하는 것을 할 수있는 하나의 해킹입니다 :

select * 
from table1 
where ',' || column1 || ',' like '%,' || (?parameter) || ',%'; 

이 기능을하지만 column1에 인덱스를 사용하지 않습니다. 다음과 같은 다른 솔루션에 대해 생각해보십시오.

  • 문자열을 테이블 변수로 구문 분석합니다.
  • in을 고정 된 수의 매개 변수와 함께 사용하십시오.
  • 테이블에 값 저장.

다른 Oracle 관련 솔루션도있을 수 있습니다.

+1

"Hack"은 너무 강한 단어입니다. 물론 옵티마이 저가 아무 것도 할 수 없지만 성능상의 문제가 발생하지 않거나 그렇게하지 않을 수도 있습니다. 이 접근 방식에 대한 좋은 점은 (지금도 제안하려고했던) 기능 *을 제공한다는 것입니다. 따라서 다른 것들을 제공 할 수 있습니다. – Bohemian

0

MS SQL을 사용하면 테이블 값으로 변환하고 조건에 따라 조인을 사용할 수 있습니다. 오라클에 익숙하지 않지만 같은 방법으로 찾을 수 있습니다.

DECLARE @IDs varchar(max) ='1,2,3'; 
;WITH Cte AS 
( 
    SELECT 
     CAST('<ID>' + REPLACE(@IDs, ',' , '</ID><ID>') + '</ID>' AS XML) AS IDs 
) 

SELECT '''' + Split.a.value('.', 'VARCHAR(100)') +'''' AS ID FROM Cte 
    CROSS APPLY Cte.IDs.nodes('/ID') Split(a) 
0

with 절을 사용하여 구현할 수 있습니다. 여기서 논리는 각 쉼표로 구분 된 값을 다른 행으로 변환하는 것입니다.

with temp_tab as ( 
    select replace(regexp_substr(parameter, '[^,]+',1, level),'''','') as str 
    from dual 
    connect by level<= length(regexp_replace(parameter, '[^,]+'))+1) 

select * from table1 where column1 in (select str from temp_tab);