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
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 와 같은 범용 함수를 구현하기 보다는
지금 구하고자하는 자료만을 위한 간단 로직을 구상하시는게 좋을 듯 합니다.
괄호<> 를 없애는 구문인 듯 한데
괄호<>의 위치가 어떻게 되는지?
- 앞에 나오는지? 뒤에 나오는지? 중간에 나오는지? 한번만 나오는지? 여러번 나오는지?
원본 대비 결과 자료 샘플을 보여주세요.
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
;