검색조건 다는게 쉽지가 않네요 0 8 1,317

by 충성 [SQL Query] 도움을 부탁드립니다. [2014.12.02 19:25:00]


IF I_CON_TYPE = 'O' THEN
            OPEN I_RC1 FOR
              SELECT  TO_SINGLE_BYTE(A.DIAG_CD) AS CODE, TO_SINGLE_BYTE(A.DIAG_ENM) AS NM, TO_SINGLE_BYTE(A.DIAG_KNM) AS DIAG
              FROM    ma_tb A
              WHERE ((REGEXP_LIKE (UPPER(A.DIAG_CD) ,UPPER(I_SCH_STR)))  OR (A.DIAG_CD    = NVL(I_SCH_STR,A.DIAG_CD)))
          ELSE
            OPEN I_RC1 FOR
              SELECT  TO_SINGLE_BYTE(A.DIAG_CD) AS CODE, TO_SINGLE_BYTE(A.DIAG_ENM) AS NM, TO_SINGLE_BYTE(A.DIAG_KNM) AS DIAG
              FROM    ma_tb A
              WHERE ((UPPER(A.DIAG_CD)  IN (UPPER(I_SCH_STR)))  OR (A.DIAG_CD    = NVL(I_SCH_STR,A.DIAG_CD)))
          END IF;

 

이런식으로 되어있습니다.

 

근데 문제는 else일때 조건인데

I_SCH_STR <- 이게 파라미터인데

배열을 문자열로 붙여서 보내짐니다.

그래서 REGEXP_LIKE 이걸 사용해서 조건을 걸면 원하는대로 나오는데

else경우에는 like조건으로 배열을 잘라서 조회한다음 and조건이 되어야 하는데

어떻게 해야 할지가 막막 하네요

고수님들 알려주세요

안에서 루프를 돌려야 할거 같긴한데....

 

I_SCH_STR 이 파라미터가 'time|run'

이런식으로 들어오는데 동적으로 들어와서 몇개가 들어올지 모름니다.

REGEXP_LIKE 이걸로 할경우에는 모두 라이크가 되지만

 

원하는것은 해당컬럼 like 첫번째 and 해당걸럼 like 두번째 이런식의 조건을 얻고 싶습니다.

 

REGEXP_LIKE이 것을 경우에는 해당컬럼 like 첫번째 or 해당걸럼 like 두번째 이런식이고

 

in 같은경우는 and조건은 맞는데 like가 안되어서.....

 

도와주세요..

 

 

 

 

by 마농 [2014.12.03 08:43:32]
WITH t AS
(
SELECT 1 pk, 'time' v FROM dual
UNION ALL SELECT 2, 'run'     FROM dual
UNION ALL SELECT 3, 'timerun' FROM dual
UNION ALL SELECT 4, 'runrun'  FROM dual
)
-- 4번 처럼 같은 단어가 중복해서 나오는 자료만 없다면...
SELECT *
  FROM t
 WHERE REGEXP_COUNT(v, 'time|run') = 2
;

 


by 충성 [2014.12.03 09:20:50]

pk v

3 timerun
4 runrun

해보니 결과값이 이렇게 나오더라구요

 

제가 설명이 이상해서 그런지 이해를 잘 못했는지 모르지만.

 

만약에

SELECT *
  FROM t
 WHERE REGEXP_COUNT(v, 'time|run') = 2

여기에서 파라미터가 'time|run' 이 맞다면

결과값이

time라이크 조건과 AND run의 라이크 조건이 둘다 만족하는 결과가 나오게 하려는것이고

결과는 3 timerun 하나가 나오게 하고 싶은것입니다.

그리고 궁금한건  WHERE REGEXP_COUNT(v, 'time|run') = 2
여기에서 2의 사용이 어떻게 하는건지 정확히 모르겠네요

1할때랑 2할때랑 3할때랑 경과가 다 다르게 나오네요...

검색을 해보니 지식이 부족하여 정확히 이해를 못하고 있네요....

아뭍은 이런 방법도 있는것에 알려주심 감사드립니다.

충성!!


by 마농 [2014.12.03 09:25:50]

제가 답변 달면서 단서조항을 하나 달았습니다.

4, runrun 과 같은 자료는 없다고 가정하고 답변 드린것입니다.

이런 자료가 존재한다면 이 방법을 사용하면 안되겠지요.

 

숫자 2 는 파라미터의 갯수입니다. (time 과 run 2개를 의미)

 

LIKE 가 문자열 검색해서 맞는걸 찾는거라면?

COUNT 는 문자열 검색해서 갯수를 세는 것입니다.


by 충성 [2014.12.03 09:33:12]

근데 제가 그 숫자를 1로 해보니

결과값이

time

run

1 2번의 두개의 값이 검색되어 나와서

어떻게나오는건지 이해가 안갔습니다.


by 마농 [2014.12.03 09:40:28]

time 또는 run 의 검색 Count 가 2 인지를 체크하는 구문이죠.

time 은 time 이 1개

run 은 run 이 1개

timerun 은 time 이 1개, run 이 1개 합이 2개

runrun 은 run 이 2개 ==> 이런 자료가 존재하는지 확인해야죠.

이런 자료가 존재한다면 사용할 수 없는 방법입니다.
 


by 충성 [2014.12.03 09:43:46]

네 감사합니다 그럼 다른 방법을 모색해봐야 겟군요....


by 마농 [2014.12.03 09:56:30]

검색 조건만 예를 들어주셨는데요. 'time|run'

비교하는 컬럼에 저장된 값의 형태는 어떻게 되어 있나요?


by 마농 [2014.12.03 10:01:29]
WITH t AS
(
SELECT 1 pk, 'time' diag_cd FROM dual
UNION ALL SELECT 2, 'run'     FROM dual
UNION ALL SELECT 3, 'timerun' FROM dual
UNION ALL SELECT 4, 'runrun'  FROM dual
)
SELECT *
  FROM t a
 WHERE EXISTS (SELECT COUNT(*)
                 FROM (SELECT 'time|run' i_sch_str FROM dual)
                WHERE UPPER(a.diag_cd)
                 LIKE '%'||REGEXP_SUBSTR(UPPER(i_sch_str), '[^|]+', 1, LEVEL)||'%'
                HAVING COUNT(*) = REGEXP_COUNT(i_sch_str, '\|') + 1
                CONNECT BY LEVEL <= REGEXP_COUNT(i_sch_str, '\|') + 1
               )
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입