안녕하세요..오라클 12C를 사용 중입니다.
제외단어를 제거한 후 값에 포함단어가 존재하는지 여부를 체크 하려고 하는데요..
WITH IN_TXT AS ( /*포함단어*/ SELECT '사과' TXT FROM DUAL UNION ALL SELECT '바나나' TXT FROM DUAL ), EX_TXT AS ( /*제외단어*/ SELECT '맛 없는 사과' TXT FROM DUAL UNION ALL SELECT '노랑 바나나' TXT FROM DUAL ), VAL_TXT AS ( /*체크대상*/ SELECT 1 RN, '맛 있는 사과도 있고 맛 없는 사과도 있다.' VAL FROM DUAL UNION ALL SELECT 2 RN, '맛 없는 사과도 있고 노랑 바나나도 있고 포도도 있다.' VAL FROM DUAL UNION ALL SELECT 3 RN, '포도도 있다.' VAL FROM DUAL ) SELECT V.RN, V.VAL, I.TXT I_TXT, E.TXT E_TXT FROM VAL_TXT V LEFT JOIN EX_TXT E ON V.VAL LIKE '%' || E.TXT || '%' LEFT JOIN IN_TXT I ON REPLACE(REPLACE(V.VAL, '.', ''), E.TXT, '') LIKE '%' || I.TXT || '%' ;
체크대상(VAL_TXT)은 전체 가져오고 그 체크대상(VAL_TXT)의 값(VAL)의 내용에서 제외단어(EX_TXT)를 지우고 나서 포함단어(IN_TXT)의 내용이 존재 하는지
With문을 새로 추가 하거나 하지 않고 체크해 보려고 하는데 잘 안되네요..
원하는 결과는 다음과 같습니다.
RN | VAL | CHK_YN |
1 | 맛 있는 사과도 있고 맛 없는 사과도 있다. | Y |
2 | 맛 없는 사과도 있고 노랑 바나나도 있고 포도도 있다. | N |
3 | 포도도 있다. | N |
이게 가능 할까요?? 도움 부탁드립니다..
WITH in_txt AS ( /*포함단어*/ SELECT '사과' txt FROM dual UNION ALL SELECT '바나나' FROM dual ) , ex_txt AS ( /*제외단어*/ SELECT '맛 없는 사과' txt FROM dual UNION ALL SELECT '노랑 바나나' FROM dual ) , val_txt AS ( /*체크대상*/ SELECT 1 rn, '맛 있는 사과도 있고 맛 없는 사과도 있다.' val FROM dual UNION ALL SELECT 2, '맛 없는 사과도 있고 노랑 바나나도 있고 포도도 있다.' FROM dual UNION ALL SELECT 3, '포도도 있다.' FROM dual ) SELECT rn , val , CASE WHEN REGEXP_LIKE(REGEXP_REPLACE(val, x), n) THEN 'Y' ELSE 'N' END chk_yn FROM val_txt , (SELECT LISTAGG(txt, '|') WITHIN GROUP(ORDER BY 1) x FROM ex_txt) , (SELECT LISTAGG(txt, '|') WITHIN GROUP(ORDER BY 1) n FROM in_txt) ;
WITH in_txt AS ( /*포함단어*/ SELECT '사과' txt FROM dual UNION ALL SELECT '바나나' FROM dual ) , ex_txt AS ( /*제외단어*/ SELECT '맛 없는 사과' txt FROM dual UNION ALL SELECT '노랑 바나나' FROM dual ) , val_txt AS ( /*체크대상*/ SELECT 1 rn, '맛 있는 사과도 있고 맛 없는 사과도 있다.' val FROM dual UNION ALL SELECT 2, '맛 없는 사과도 있고 노랑 바나나도 있고 포도도 있다.' FROM dual UNION ALL SELECT 3, '포도도 있다.' FROM dual ) , tmp1 AS ( SELECT a.rn, a.val, b.txt , COUNT(*) OVER(PARTITION BY rn) cnt , ROW_NUMBER() OVER(PARTITION BY rn ORDER BY 1) seq FROM val_txt a , ex_txt b ) , tmp2(rn, val, cnt, seq, x) AS ( SELECT rn, val, cnt , seq , REPLACE(val, txt) x FROM tmp1 WHERE seq = 1 UNION ALL SELECT p.rn, p.val, p.cnt , c.seq , REPLACE(p.x, c.txt) x FROM tmp2 p , tmp1 c WHERE c.rn = p.rn AND c.seq = p.seq + 1 ) SELECT rn , val , CASE WHEN EXISTS (SELECT 1 FROM in_txt WHERE INSTR(m.x, txt) > 0) THEN 'Y' ELSE 'N' END chk_yn FROM tmp2 m WHERE cnt = seq ;