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가 안되어서.....
도와주세요..
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할때랑 경과가 다 다르게 나오네요...
검색을 해보니 지식이 부족하여 정확히 이해를 못하고 있네요....
아뭍은 이런 방법도 있는것에 알려주심 감사드립니다.
충성!!
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 ) ;