안녕하세요..오라클 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
;