mysql regex replace 함수 사용 질문드립니다. 0 3 1,601

by 너구링 [MySQL] [2021.04.08 14:10:19]


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 함수는 이렇게 따로 생성해줬습니다...

 

by 마농 [2021.04.08 14:40:24]

MySQL 버전이 어떻게 되나요?
이전 버전에서는 REGEXP 만 사용 가능했는데요.
최신 버전에서는 Oracle 과 동일하게 여러가지 구문 사용이 가능합니다.
함수 로직을 보면 1글자씩 끊어서 REGEXP 비교를 하는데 틀린 방법입니다.
REGEXP_REPLACE 와 같은 범용 함수를 구현하기 보다는
지금 구하고자하는 자료만을 위한 간단 로직을 구상하시는게 좋을 듯 합니다.
괄호<> 를 없애는 구문인 듯 한데
괄호<>의 위치가 어떻게 되는지?
- 앞에 나오는지? 뒤에 나오는지? 중간에 나오는지? 한번만 나오는지? 여러번 나오는지?
원본 대비 결과 자료 샘플을 보여주세요.


by 너구링 [2021.04.08 14:54:31]

답변 감사합니다 .

 

자료 샘플은 

<C>안녕하세요</C> <D>저희 회사에서는</D> 

이런식으로 내용에 <C>타입등이 들어 있어 이 부분을 지우고 데이터를 추출하려하구요..

쿼리내용처럼 TERMINOLOGY_KOREAN_EXPLAIN_1, TERMINOLOGY_KOREAN_EXPLAIN_2, TERMINOLOGY_KOREAN_EXPLAIN_3, TERMINOLOGY_KOREAN_EXPLAIN_4 컬럼을 머지하여 결과를 추출하고 싶습니다..

 


by 마농 [2021.04.08 16:22:45]
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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입