2011년 4월 27일 수요일

[Oracle] 숫자타입이 아닌 문자가 존재하는 컬럼 필터

데이터베이스를 개발하거나 유지보수를 하다 보면 데이터의 품질에 대한 고려를
전혀 하지 않는 프로그램들을 많이 볼수가 있습니다.

이럴때 정말 데이터베이스 전문가가 절실하구나 하는 생각이 들죠.
개발자가 만들어 놓은 데이터베이스의 관계도나 제약조건등은 전무하고 단순하게
개발을 위해서만 정하는 컬럼명이나 속성을 보다 보면 답답하기 그지 없습니다.

말도 안되는 컬럼으로 20분 동안 삽질하다가 우리 같은 사람이 있겠거니 해서
공유합니다.

* 상황은 이렇습니다.
  실제 저장되는 데이터는 숫자형 이나 데이터 컬럼은 VARCHAR2 로 정의 되어 있음
  이렇다 보니 INPUT에서 걸러야 하나 이것도 안되어 있어 문자/숫자 섞여 있음  

  해당 데이터를 조회하여 숫자식으로 환산하는 결과를 얻으려고 할때
  문자가 아닌 양의수의 값만을 걸러 낼때 아래와 같이 하면 도움이 됩니다.

* 해결방안
   오라클 함수중에 REGEXP_INSTR(...)이 있는데 정규식을 이용해서 해당 컬럼의
   원하는 정규식 pattern의 자리수를 얻어 옵니다. 

SELECT COL FROM (
    SELECT '12.0' AS COL FROM DUAL
    UNION ALL SELECT '52/0' FROM DUAL
    UNION ALL SELECT '52U0' FROM DUAL
    UNION ALL SELECT '%2U0' FROM DUAL
) T
WHERE  REGEXP_INSTR(T.COL , '[^{.1234567890}]') <= 0

댓글 없음:

댓글 쓰기

언제 부터 였던가 생각해보니 아르바이트 겸 외부 컨설팅을 의뢰 받고 맥북 프로를 처음 써봤을 때 부터 였던 것 같다. 지금은 거의 대부분의 작업을 맥으로 작업을 하다 보니 윈도우에서만 실행되는 일부 프로그램들 때문과 회사 내부 ERP프로그램이 윈도우 ...