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 ;