티스토리 뷰

반응형

안녕하세요. 바로 아래 글에서 인포믹스에서 정규식 패턴 변경 함수인 REGEX_REPLACE 를 테스트했습니다.
대신 REGEX_REPLACE 함수는 인포믹스 12버전에서만 지원되기에 질문자 분이 12 이하 버전에서 가능한 방법을 다시 질문하셨더군요. 해당 쿼리를 다시 데이터베이스 사랑넷의 '마농'님께서 기본적인 문자열 함수를 사용해서 쿼리를 재작성하신 것으로 테스트해봤습니다.

 

먼저 Oracle 정규식 함수를 사용한 SQL입니다.

WITH t AS
(
SELECT '문자001' v FROM dual
UNION ALL SELECT '문자열01'    FROM dual
UNION ALL SELECT '01문자001'   FROM dual
UNION ALL SELECT '121문자열01' FROM dual
UNION ALL SELECT '문자002'     FROM dual
UNION ALL SELECT '문자003'     FROM dual
)
-- Oracle 정규식 --
SELECT v
     , REGEXP_REPLACE(REGEXP_REPLACE(v
       , '([0-9]+)$', '000\1')
       , '0+([0-9]{4})$', '\1')
       AS x
  FROM t
;

아래는 REGEX_REPLACE 대신 SUBSTR 과 LPAD 함수를 사용한 방법입니다.

WITH t AS
(
SELECT '문자001' v FROM dual
UNION ALL SELECT '문자열01'    FROM dual
UNION ALL SELECT '01문자001'   FROM dual
UNION ALL SELECT '121문자열01' FROM dual
UNION ALL SELECT '문자002'     FROM dual
UNION ALL SELECT '문자003'     FROM dual
UNION ALL SELECT '문자1'       FROM dual
UNION ALL SELECT '문자'        FROM dual
UNION ALL SELECT '문자11A03'   FROM dual
)
SELECT v
     , SUBSTR(v, 1, x-y) || LPAD(SUBSTR(v, x-y+1, 4), 4, '0') z
  FROM (SELECT v
             , x
             , CASE WHEN SUBSTR(v, x-0, 1) BETWEEN '0' AND '9' THEN 1
             + CASE WHEN SUBSTR(v, x-1, 1) BETWEEN '0' AND '9' THEN 1
             + CASE WHEN SUBSTR(v, x-2, 1) BETWEEN '0' AND '9' THEN 1
             + CASE WHEN SUBSTR(v, x-3, 1) BETWEEN '0' AND '9' THEN 1
               ELSE 0 END ELSE 0 END ELSE 0 END ELSE 0 END AS y
          FROM (SELECT v, LENGTH(v) x FROM t) a
        ) a
;

 인포믹스 11버전에서 그대로 사용해도 잘 수행되네요. 참고로 WITH문은 샘플 데이터입니다.
정말 멋지네요. '마농'님께 제대로 배웠습니다.

https://database.sarang.net/?inc=read&aid=41526&criteria=oracle&subcrit=&id=0&limit=20&keyword=regex_replace&page=1 

 

데이터베이스를 사랑하는 사람들의 모임 데이터베이스 사랑넷

안녕하세요. 지금 있는 곳에서 쓰는 디비가 오라클이랑 informix입니다. 컬럼 데이터가 '문자001' '문자열01' '01문자001' '121문자열01' '문자002' '문자003' 이런식으로... 복합접으로 들어가 있는 컬럼이

database.sarang.net

반응형
댓글