표준화를 위해 용어를 단어로 분리해보자.
예제를 위해 아래와 같이 테이블을 생성하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- 1 DROP TABLE t_term PURGE; DROP TABLE t_word PURGE; CREATE TABLE t_term (term VARCHAR2(100)); CREATE TABLE t_word (word VARCHAR2(100)); INSERT INTO t_term VALUES ( '고객번호' ); INSERT INTO t_term VALUES ( '고객전화번호' ); INSERT INTO t_term VALUES ( '고객자택전화번호' ); INSERT INTO t_term VALUES ( '우수고객자택전화번호복문' ); INSERT INTO t_word VALUES ( '고객' ); INSERT INTO t_word VALUES ( '전화' ); INSERT INTO t_word VALUES ( '전화번호' ); INSERT INTO t_word VALUES ( '번호' ); COMMIT ; |
아래 쿼리로 용어를 단어로 분리할 수 있다. 단어가 길수록 우선순위가 높으며(전화번호 > 전화, 번호), 일치하지 않은 단어는 ?로 표시했다.
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 |
-- 2 SELECT a.term , a.term_n , a.word , NVL2 (REGEXP_REPLACE (a.word, a.word_ag), '?' , a.word) AS word_n FROM ( SELECT a.* , b.lv , REGEXP_SUBSTR (a.term_n, '[^_]+' , 1, b.lv) AS word FROM ( SELECT a.* , REPLACE (TRIM ( '_' FROM REGEXP_REPLACE (a.term, '(' || a.word_ag || ')' , '_\1_' )) , '__' , '_' ) AS term_n FROM ( SELECT a.term , LISTAGG (a.word, '|' ) WITHIN GROUP ( ORDER BY a.pos) AS word_ag FROM ( SELECT a.* , LAG (a.word) OVER (PARTITION BY a.term ORDER BY a.pos, a.len) AS word_bf , LEAD (a.word) OVER (PARTITION BY a.term ORDER BY a.pos, a.len) AS word_af FROM ( SELECT a.term , b.word , INSTR (a.term, b.word) AS pos , LENGTH (b.word) AS len FROM t_term a , t_word b WHERE INSTR (a.term, b.word) > 0) a) a WHERE NVL (INSTR (a.word_af, a.word), 0) = 0 AND NVL (INSTR (a.word_bf, a.word), 0) = 0 GROUP BY a.term) a) a , ( SELECT LEVEL AS lv FROM DUAL CONNECT BY LEVEL <= 10) b WHERE b.lv <= REGEXP_COUNT (a.term_n, '_' ) + 1) a ORDER BY a.term , a.lv; TERM TERM_N WORD WORD_N ------------------------ ---------------------------- -------- -------- 고객번호 고객_번호 고객 고객 고객번호 고객_번호 번호 번호 고객자택전화번호 고객_자택_전화번호 고객 고객 고객자택전화번호 고객_자택_전화번호 자택 ? 고객자택전화번호 고객_자택_전화번호 전화번호 전화번호 고객전화번호 고객_전화번호 고객 고객 고객전화번호 고객_전화번호 전화번호 전화번호 우수고객자택전화번호복문 우수_고객_자택_전화번호_복문 우수 ? 우수고객자택전화번호복문 우수_고객_자택_전화번호_복문 고객 고객 우수고객자택전화번호복문 우수_고객_자택_전화번호_복문 자택 ? 우수고객자택전화번호복문 우수_고객_자택_전화번호_복문 전화번호 전화번호 우수고객자택전화번호복문 우수_고객_자택_전화번호_복문 복문 ? 12 개의 행이 선택되었습니다. |
'Oracle > SQL' 카테고리의 다른 글
ORA-00937 에러 (0) | 2019.04.22 |
---|---|
NVL, NVL2 함수의 인수 평가 (0) | 2019.03.29 |
클로저 테이블 #2 (0) | 2019.02.01 |
클로저 테이블 #1 (0) | 2019.01.31 |
화물수량별 차등운임 계산 (0) | 2018.12.27 |