database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41526 게시물 읽기
No. 41526
한 컬럼에서 문자와 숫자 분리하기..
작성자
박양희(sadadboy)
작성일
2018-02-20 13:53ⓒ
2018-02-20 13:54ⓜ
조회수
1,847

안녕하세요.

지금 있는 곳에서 쓰는 디비가 오라클이랑 informix입니다.

 

컬럼 데이터가

'문자001'

'문자열01'

'01문자001'

'121문자열01'

'문자002'

'문자003'

 

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

 

이것을

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

 

그래서 결과가

'문자0001'

문자열0001'

01문자0001'

121문자열0001'

'문자0002'

'문자0003'

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

 

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

이 글에 대한 댓글이 총 6건 있습니다.

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
;

마농(manon94)님이 2018-02-20 16:31에 작성한 댓글입니다.

인포믹스에서는 12버전부터 REGEX_REPLACE 함수를 사용할 수 있네요.

마농님이 작성하신 쿼리에서 함수이름만 바꿔서 실행해봤습니다.

 

SELECT v
     , REGEX_REPLACE(REGEX_REPLACE(v
       , '([0-9]+)$', '000\1')
       , '0+([0-9]{4})$', '\1')
       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.
 

 

정상규(pajama)님이 2018-02-21 15:16에 작성한 댓글입니다.

 마농님, 정상규님 댓글 감사합니다.

 

마농님이 올려주신 오라클에서의 쿼리는 적용이 되는데.

인포믹스에서는 12버전이 아니라 적용이 안되네요.

regex_replace 를 사용하지 않고 인포믹스에서도 가능할까요??

 

박양희(sadadboy)님이 2018-02-22 12:49에 작성한 댓글입니다.

안녕하세요. 문자열 길이가 가변적이라 인포믹스 11버전 이하에서 단일쿼리로 변경이 가능할 지 모르곘습니다.

db function이나 외부 프로그램 로직에서 처리를 거쳐야 할 것 같습니다.

테스트가 가능하시다면 아래사이트에서 사용자 함수 라이브러리를 설치해서 사용해보시는 것도 방법이겠네요.

오라클도 9i일때는 별도 로직을 구현한 사례가 있더군요.

http://phil-sqltips.blogspot.kr/2009/06/regexpreplace-regexplike-for-oracle-9i.html

 

아래 링크를 참고해보시기 바랍니다. 인포믹스에서 regexp_replace를 사용자 함수로 구현한 내용입니다.

https://www.ibm.com/developerworks/data/zones/informix/library/techarticle/db_regexp.html

http://www.oninit.com/download/regexp.1.1.tar.gz

정상규(pajama)님이 2018-02-22 14:35에 작성한 댓글입니다.

오라클 기본적인 문자함수들로만 구성해 봤습니다.
인포믹스에 맞게 고쳐 보세요.

 

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
;

마농(manon94)님이 2018-02-22 16:46에 작성한 댓글입니다.
이 댓글은 2018-02-22 17:08에 마지막으로 수정되었습니다.

안녕하세요. 마농님. 다시 작성해주신 쿼리는 인포믹스 11버전이상이면 잘 수행되는 것을 확인했습니다.

작성하신 쿼리를 보니 감탄만 나오네요. 알려주셔서 감사합니다.

정상규(pajama)님이 2018-02-22 18:25에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41529경우의 수 ? 짜는 로직이 있을까요? [2]
XRP에물림
2018-02-28
1364
41528rank() over() 와 비슷하게 정렬 순위 매기기 도움이 필요합니다. [4]
초보
2018-02-22
1762
41527oracle 버전 숫자의 의미를 알고 싶어요 [1]
박도현
2018-02-21
1344
41526한 컬럼에서 문자와 숫자 분리하기.. [6]
박양희
2018-02-20
1847
41525단위가 다른 정보 조회하기 [2]
일쌍다반사
2018-02-14
1415
41524view pk 컬럼을 다른테이블에 참조키로 사용할수 없나요?
전윤기
2018-02-14
1433
41522주소에서 번지까지만 추출 [3]
쿼리질문
2018-02-06
1718
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2019 DSN, All rights reserved.
작업시간: 0.068초, 이곳 서비스는
	PostgreSQL v11.5로 자료를 관리합니다