안녕하세요..오라클 12C를 사용 중입니다.
제외단어를 제거한 후 값에 포함단어가 존재하는지 여부를 체크 하려고 하는데요..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 |
이게 가능 할까요?? 도움 부탁드립니다..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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) ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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 ; |