Dic매칭외의 비매칭 결과를 null로 하려면,, 0 10 2,761

by Daff [SQL Query] REGEXP_REPLACE [2011.07.01 10:59:28]



dic 테이블에 있는 한글명에 매칭되는 영문명으로 REPLACE 시키는 함수입니다,,
하나 만들어서 다방면으로 써먹고 있는 함수 입니다..
지난번에는 공백제거 하는걸 고민하다 물었었는데
요번엔,, 매칭되지 않는 경우는 Null로 해야 해서 이것저것 해보다가 질문드립니다..

=> IF 문 넣어서 일부 해결은 되었네요, 하지만...

CREATE OR REPLACE FUNCTION F_RP_DIC(v VARCHAR2)
RETURN VARCHAR2
IS
vRtn VARCHAR2(100) := v;
BEGIN
 FOR c IN (SELECT * FROM &V_ENG_DIC WHERE Type_name in ('IC명', 'JC명', 'TG명', '고가명', '고속도로명', '교량명', '전용도로명', '지하차도명', '터널명') ORDER BY length(kor_name) DESC )
 LOOP
 vRtn := REPLACE(vRtn, c.Kor_name, c.Eng_name);
END LOOP;

 IF v = vRtn THEN
 RETURN NULL;
 END IF;

RETURN TRIM(vRtn);
END;

--eng_dic 테이블 예시
--KOR_NAME ENG_NAME
--송청제2교 Songcheong 2nd Bridge
--정림교 Jeongnim Bridge
--천미교 Cheonmi Bridge
--다리 (Bridge)
--복교 Bok Bridge

WITH t AS
(
SELECT '청평2교' name FROM dual
UNION ALL SELECT '덕전교' FROM dual
UNION ALL SELECT '송청제2교' FROM dual
UNION ALL SELECT '정림교' FROM dual
UNION ALL SELECT '천미교' FROM dual
UNION ALL SELECT '꽃골다리' FROM dual
UNION ALL SELECT '신복교' FROM dual
)
SELECT
name
,F_RP_DIC(name)
FROM t
;

-- 결과
NAME F_RP_POI_DIC(NAME)
청평2교 청평2교
덕전교 덕전교
송청제2교 Songcheong 2nd Bridge
정림교 Jeongnim Bridge
천미교 Cheonmi Bridge
꽃골다리 꽃골(Bridge)
신복교 신Bok Bridge

지금 저 결과로는 Dic에 없는 경우 그냥 한글명이 나오는데,
매칭되지 않는 경우 Null로 하려면 어떻게 해야 하나요..
추가) 일부만 매칭되는것도 비매칭이라고 할수 있으니, 그것도 Null이 되어야 합니다 ㅜㅜ

게시판 찾아보고 꼼수(?)를 써서 한글인 경우를 null로 해보려 했더니 결과가 더 이상하게 나오기만 하네요;;
--,REGEXP_REPLACE(F_RP_DIC(name), '[ㄱ-힣]', null)
--,REGEXP_REPLACE(F_RP_DIC(name), '([0-9]|[^ -~])', null)

by 知音 [2011.07.01 11:19:11]
간단하게 생각하면 펑션내부에 입력값이 v 와 결값인 vRtn 이 같으면 null 로 리턴하면 될 듯하네요...

by 마농 [2011.07.01 12:25:25]
REGEXP_REPLACE(f_rp_dic(name), '[^ -~]')

by Daff [2011.07.01 12:46:17]
저도 한번 펑션에서 이렇게 조건을 넣어보았는데 안되더라구요..
WHERE v = vRtn and Type_name in ('IC명', ~~
그리고
마농님처럼 하면 만약 '청평2교'이런게 name에 있을때 '2'라고 출력되길래
,REGEXP_REPLACE(F_RP_DIC(name), '([0-9]|[^ -~])')
이렇게 숫자까지 포함해서 해보았거든요,,
하지만 name에 어떤게 올지 모르지 불안해서,,
좀 정확하게 매칭이 안된경우를 찾으려면 어떻게 해야할지 고민됩니다..

by 마농 [2011.07.01 13:03:59]
그렇다면 한글만 없애는거는 아니고 知音님 말대로 비교하면 될듯한데요.

by Daff [2011.07.01 13:42:53]
CREATE OR REPLACE FUNCTION F_RP_POI_DIC(v VARCHAR2)
RETURN VARCHAR2
IS
vRtn VARCHAR2(100) := v;
BEGIN
FOR c IN (SELECT * FROM &V_ENG_DIC WHERE Type_name in ('IC명', 'JC명', 'TG명', '고가명', '고속도로명', '교량명', '전용도로명', '지하차도명', '터널명') ORDER BY length(kor_name) DESC )
LOOP
vRtn := REPLACE(vRtn, c.Kor_name, c.Eng_name);
END LOOP;

IF v = vRtn THEN
RETURN NULL;
END IF;

RETURN TRIM(vRtn);
END;

아,, 이렇게 IF 문장 넣으면 되나요,
함수도 겨우 만든건데; 이것저것 보고 따라한거라 확신이 없지만
테스트 해보니 되긴 하네요 ^^;;

by Daff [2011.07.01 14:32:18]
ㅠㅠ,
비매칭되는것 (입력값=결과값같은것)을 null로 하는걸 성공했다 싶더니,
이렇게 일부만 Replace 되는 경우가 발생하네요..ㅜㅜ

구름다리교 구름(Bridge)교
꽃골다리 꽃골(Bridge)
신복교 신Bok Bridge
고도곡교 고Dogok Bridge
소광교 소Gwang Bridge
중광교 중Gwang Bridge

by 마농 [2011.07.01 14:55:04]
知音 님이 제시한 방법과 제가 제시한 방법을 함께 사용해 보세요.

by Daff [2011.07.01 15:09:46]
WITH t AS
(
SELECT '청평2교' name FROM dual
UNION ALL SELECT '덕전교' FROM dual
UNION ALL SELECT '송청제2교' FROM dual
UNION ALL SELECT '정림교' FROM dual
UNION ALL SELECT '천미교' FROM dual
UNION ALL SELECT '꽃골다리' FROM dual
UNION ALL SELECT '신복교' FROM dual
)
SELECT
name
,F_RP_POI_DIC(name)
,REGEXP_REPLACE(f_rp_poi_dic(name), '[^ -~]')
FROM t
;

이렇게요??
하지만 위에서 꽃골다리'와 신복교'는 null이 되어야 하는데
위처럼 하면 (Bridge), Bok Bridge, 이렇게 결과가 나오는데요..그말씀이 아닌가...

by 마농 [2011.07.01 15:21:54]
결국 한글이 남아 있으면 안된다는 말인가요?
한글이 남아있는지 체크해서 남아있으면 널처리하면 되겠네요.
IF문에서 바로 정규식 사용이 가능한지는 모르겠네요.
암튼 이런 개념으로 응용해서 처리하시면 됩니다.

IF REGEXP_LIKE(vRtn, '[^ -~]') THEN
vRtn := '';
END IF;

by Daff [2011.07.01 16:45:03]
마농님말씀대로 IF문에서 정규식 사용하여 처리했습니다.
교량명칭에 대해서는 전수검사 했고,, 나머지 케이스에 황당한 건만 없으면
이것으로 적용해야겠습니다.. 감사합니다!!!!!!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입