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

댓글 없음:

댓글 쓰기

 다양한 채널의  블로그 작성으로  집중이 좀 안되기도 하고  나의 회사를 운영하고 관리 하다 보니  회사의 블로그로 작성 해보는 것은 어떤가 하고  하나로 옮겨 봅니다.  (주)다이닝웨이브 - 블로그 바로가기