티스토리 뷰

반응형

안녕하세요. 인포믹스에는 조건절에서 정규식을 사용해서 검색할 수 있는 MATCHES 키워드가 있습니다.

정규식으로 검색한 패턴을 변경하는 오라클의 REGEXP_REPLACE에 해당하는 함수는 12버전부터 지원합니다.


데이터베이스 사랑넷에서 패턴 변경에 대한 문의 내용을 발견하여 인포믹스 환경에서 테스트 해봤습니다.

아래는 질문하신 분이 올리신 글 내용입니다.

컬럼 데이터가

'문자001'

'문자열01'

'01문자001'

'121문자열01'

'문자002'

'문자003'

 

이런식으로... 복합접으로 들어가 있는 컬럼이 있는데요..

 

이것을

뒤에 001이라고 되어있는 숫자만.. 0001 로..자릿수를 맞춰야 합니다

 

그래서 결과가

'문자0001'

문자열0001'

01문자0001'

121문자열0001'

'문자0002'

'문자0003'

이렇게 뒷자리 숫자들이 공통적으로 4자리로 표현되어야 하는데요..

 

제생각으로는 문자랑 숫자(뒤쪽에 일련된 숫자)를 분리한후 뒤쪽 숫자를 0000으로 lpad해야 할거 같은데.

이게 오라클이랑 인포믹스에서 가능한가요??

출처 : 데이터베이스 사랑넷(http://database.sarang.net/?criteria=oracle&subcrit=qna&inc=read&aid=41526)


데이터베이스 사랑넷의 고수님인 '마농'님께서 답글로 아래 쿼리문을 올려주신 덕분에 쉽게 테스트 할 수 있었네요.

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
;


dbaccess에서 아래 내용을 수행해봤습니다. 수행 결과를 보기 좋게 하기 위해서 varchar(20)으로 형변환했습니다.

-- temp table 생성 및 데이터 입력 --

create temp table t (v varchar(20));
insert into t values ('문자001');
insert into t values ('문자열01');
insert into t values ('01문자001');
insert into t values ('121문자열01');
insert into t values ('문자002');
insert into t values ('문자003');


-- REGEX_REPLACE 함수 사용 결과 --

SELECT v::varchar(20)

       AS v
       , REGEX_REPLACE(REGEX_REPLACE(v
       , '([0-9]+)$', '000\1')
       , '0+([0-9]{4})$', '\1')::varchar(20)
       AS x
  FROM t
;


v                    x

문자001              문자0001
문자열01             문자열0001
01문자001            01문자0001
121문자열01          121문자열0001
문자002              문자0002
문자003              문자0003


6 row(s) retrieved.


REGEX_REPLACE는 인포믹스의 extension 기능으로 처음 호출할 때 해당 함수가 설치됩니다.

외장 함수의 형태로 생성되며, 설치되지 않은 상태에서 실행하면 자동으로 설치되는 것 같습니다.

인포믹스 메시지 로그와 데이터베이스 스키마에서 관련 내용을 확인 할 수 있습니다.


$ onstat -m

...

15:39:53  Logical Log 420 Complete, timestamp: 0xe75412.
15:40:09  INFO (autoregexe 13) (EXECUTE FUNCTION sysbldprepare ('ifxregex.*', 'create')) << 외장 함수가 설치되었음을 알림


$ dbschema -d kscdb -f all

...

create function "informix".regex_replace (lvarchar,lvarchar,lvarchar,integer default null,integer default null,integer default null)
returns lvarchar
with (parallelizable, handlesnulls, not variant, percall_cost=1000)
external name '$INFORMIXDIR/extend/ifxregex.1.00/ifxregex.bld(ifxregex_replace_char)' language c;


참고하셔서 사용하시면 유용할 것 같습니다.



관련자료

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.dbext.doc/ids_dbxt_559.htm



반응형
댓글