1 2 3 4 5 6 7 | SELECT INVENTORY_ITEM_ID, BUSINESS_TERMINOLOGY_YN AS 구분, TERMINOLOGY_KOREAN_NAME AS 한글명, TERMINOLOGY_ENGLISH_NAME AS 영문명, TERMINOLOGY_ENGLISH_ABRVN_NM AS 약어, REGEXP_REPLACE(TERMINOLOGY_KOREAN_EXPLAIN_1 || TERMINOLOGY_KOREAN_EXPLAIN_2 || TERMINOLOGY_KOREAN_EXPLAIN_3 || TERMINOLOGY_KOREAN_EXPLAIN_4, '<[^>]*>' , '' ) AS 한글정의, REGEXP_REPLACE(TERMINOLOGY_ENGLISH_EXPLAIN_1 || TERMINOLOGY_ENGLISH_EXPLAIN_2 || TERMINOLOGY_ENGLISH_EXPLAIN_3 || TERMINOLOGY_ENGLISH_EXPLAIN_4, '<[^>]*>' , '' ) AS 영문정의, FROM XX_TABLE; |
ORACLE에서 이렇게 돌리던 소스를 MYSQL에서 추출하려고 하는데
한글정의, 영문정의 부분이 계속 숫자로 나오네요.. 0, 1
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 | DELIMITER // DROP FUNCTION IF EXISTS regexp_replace// CREATE FUNCTION regexp_replace(original VARCHAR (1000),pattern VARCHAR (1000),replacement VARCHAR (1000)) RETURNS VARCHAR (1000) DETERMINISTIC BEGIN DECLARE temp VARCHAR (1000); DECLARE ch VARCHAR (1); DECLARE i INT ; SET i = 1; SET temp = '' ; IF original REGEXP pattern THEN loop_label: LOOP IF i > CHAR_LENGTH(original) THEN LEAVE loop_label; END IF; SET ch = SUBSTRING (original,i,1); IF NOT ch REGEXP pattern THEN SET temp = CONCAT( temp ,ch); ELSE SET temp = CONCAT( temp ,replacement); END IF; SET i=i+1; END LOOP; ELSE SET temp = original; END IF; RETURN temp ; END // DELIMITER ; |
REGEXP_REPLACE 함수는 이렇게 따로 생성해줬습니다...
MySQL 버전이 어떻게 되나요?
이전 버전에서는 REGEXP 만 사용 가능했는데요.
최신 버전에서는 Oracle 과 동일하게 여러가지 구문 사용이 가능합니다.
함수 로직을 보면 1글자씩 끊어서 REGEXP 비교를 하는데 틀린 방법입니다.
REGEXP_REPLACE 와 같은 범용 함수를 구현하기 보다는
지금 구하고자하는 자료만을 위한 간단 로직을 구상하시는게 좋을 듯 합니다.
괄호<> 를 없애는 구문인 듯 한데
괄호<>의 위치가 어떻게 되는지?
- 앞에 나오는지? 뒤에 나오는지? 중간에 나오는지? 한번만 나오는지? 여러번 나오는지?
원본 대비 결과 자료 샘플을 보여주세요.
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 | DELIMITER // DROP FUNCTION IF EXISTS f_replace_tag; CREATE FUNCTION f_replace_tag(v_org NVARCHAR(1000)) RETURNS NVARCHAR(1000) DETERMINISTIC BEGIN DECLARE v_rtn NVARCHAR(1000) DEFAULT '' ; DECLARE v_char NVARCHAR(1); DECLARE v_flag INT DEFAULT 0; DECLARE i INT DEFAULT 1; WHILE i <= LENGTH(v_org) DO SET v_char = SUBSTRING (v_org, i, 1); IF v_char = '<' THEN SET v_flag = 1; END IF; IF v_flag = 0 THEN SET v_rtn = CONCAT(v_rtn, v_char); END IF; IF v_char = '>' THEN SET v_flag = 0; END IF; SET i = i + 1; END WHILE; RETURN v_rtn; END ; // DELIMITER ; SELECT v , f_replace_tag(v) x FROM ( SELECT '<C>안녕하세요</C> <D>저희 회사에서는</D>' v) a ; |