2012-07-19 5 views
2

보고 도구에서 프롬프트 용 sql을 작성해야합니다. 변수에 여러 값의 목록을 '-'로 구분하고 그 값의 수를 다양하게 지정할 수 있습니다 (예 : "abc-def"eg2. "abc-def-xyz").동적 수 where oracle sql의 조건

지금 내가 쿼리에 대한 PLSQL을 사용할 수 없습니다

select something 
    from somewhere 
where someColumn in 'abc' -- use substr to extract abc 
    or someColumn in 'def' -- use substr to extract def 
    or ...till we don't find '-'. 

(논리적으로)이 양식의 오라클 SQL을 작성해야합니다. 내가 plsql에서 선택한 변수를 사용하고 있지 않거나보고 도구가이를 지원하지 않을 수 있습니다.

미리 감사드립니다.

답변

6

select something 
    from somewhere 
where someColumn in (select regexp_substr('abc-def-xyz','[^-]+', 1, level) from dual 
        connect by regexp_substr('abc-def-xyz', '[^-]+', 1, level) is not null); 

가 ("의"필드에 의해 분리되어 고려) - 일반화하려고

SQL> select regexp_substr('abc-def-xyz','[^-]+', 1, level) value from dual 
     connect by regexp_substr('abc-def-xyz', '[^-]+', 1, level) is not null; 

VALUE        
-------------------------------- 
abc        
def        
xyz 
0

당신은 단지 포함 된 결과 목록을 원하는 경우 '-'어디 선가

SELECT 뭔가처럼, 당신은 그냥 할 수있는 일을 WHERE SOMECOLUMN LIKE ('% - %');

select something 
    from somewhere 
where someColumn in (select regexp_substr(variable,'[^-]+', 1, level) from dual 
        connect by regexp_substr(variable, '[^-]+', 1, level) is not null); 

기본적 부질의 출력은 다음과 같다 -

+0

. 그걸 살펴 봐도 될까요? – chemicalkt

1

우선 Oracle의 regexp_substr() 함수를 사용하여 문자열을 해당 부분으로 분리합니다. regexp_substr function (. 당신이 문자열을 생성하는 원본에 액세스 할 수 있으면, 그냥 사용)를 참조하십시오

둘째, 다음 임시 테이블에 넣고 그냥이 : 나는 질문을 편집 한

select something 
    from somewhere 
where someColumn in (select parts from tmpTable) 
+0

임시 테이블이 필요 없으며 인라인보기만으로 충분합니다. 또한보고 도구에서 PLSQL 저장 프로 시저 (어쨌든 수행 할 수 있음)를 사용하여 임시 테이블 (사용자 입력 포함)을 채우는 것이 불필요한 것으로 보입니다. – Annjawn

+0

@Annjawn, 나는 임시 테이블에 관해 당신과 의견을 같이합니다.하지만 그는 이것에 대해 아주 새롭기 때문에 가능한 간단하고 견고 할 수 있도록하고 싶습니다. – JBrooks

1
select something 
    from somewhere 
where INSTR('-'||'abc-def-ghi'||'-', '-'||someColumn||'-') > 0;