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 39585 게시물 읽기
No. 39585
문자형으로 입력된 값에서 숫자 형태로 입력된 데이터만 조회가 가능할까요 ?
작성자
이솔렛(isolette)
작성일
2012-08-09 10:59
조회수
6,034

안녕하세요.

테이블 문자형 칼럼값에서 숫자로 입력된 값 중 원하는 숫자 범위만 조회가 가능한지 궁금합니다.

아래는 샘플쿼리입니다.

1. 숫자형태만 뽑는 쿼리 

SELECT 
 NO,
 ATWRT 
FROM
(
 SELECT 1 AS NO, '0.01' AS ATWRT FROM dual
 UNION
 SELECT 2 AS NO, '2.5' AS ATWRT FROM dual
 UNION
 SELECT 3 AS NO, '1' AS ATWRT FROM dual
 UNION
 SELECT 4 AS NO, '14.99' AS ATWRT FROM dual
 UNION
 SELECT 5 AS NO, '3' AS ATWRT FROM dual
 UNION
 SELECT 6 AS NO, 'ABC' AS ATWRT FROM dual  
)
WHERE 
 REGEXP_LIKE(TRIM(ATWRT), '[[:digit:]]')

 

2. 위 쿼리에서 2보다 크고, 5보다 작은 값을 조회하려고 하면

'ORA-01722 수치가 부적합합니다.' 오류가 발생합니다.

SELECT
 NO,
 ATWRT 
FROM
(
 SELECT 1 AS NO, '0.01' AS ATWRT FROM dual
 UNION
 SELECT 2 AS NO, '2.5' AS ATWRT FROM dual
 UNION
 SELECT 3 AS NO, '1' AS ATWRT FROM dual
 UNION
 SELECT 4 AS NO, '14.99' AS ATWRT FROM dual
 UNION
 SELECT 5 AS NO, '3' AS ATWRT FROM dual
 UNION
 SELECT 6 AS NO, 'ABC' AS ATWRT FROM dual  
)
WHERE
 REGEXP_LIKE(TRIM(ATWRT), '[[:digit:]]')
 AND TO_NUMBER(ATWRT) BETWEEN TO_NUMBER('2') and TO_NUMBER('5')

 

읽어주셔서 감사합니다.

 

 

 

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

저는 오류 발생안되고 잘 출력되는데요

NO   ATWRT

2          2.5

5            3

이용헌(dldydgjs10)님이 2012-08-09 11:07에 작성한 댓글입니다.

조건절이 어떤것이 먼저 실행되는냐에 따라서 오류가 발생할수도 있겠네요

[[digit]] 이게 다음 조건절보다 실행이 늦어지면 오라클 오류가 발생할수 있으니...

오류를 원천적으로 발생하지 않기 위해서는

1. 번쿼리를 다시 감싼후 where에 다음 조건을 추가하는것이 좋겠네요

예)

select * from

(1번 쿼리 where ~~~ [digit] )

where to_number(atwrt) between 2 and 5

 

 

오케클릭(okclick)님이 2012-08-09 11:15에 작성한 댓글입니다.

두가지 조건중 어떤 조건이 먼저 수행되느냐에 따라
에러가 날수도 있고 안날수도 있겠네요.
단순하게 조건의 순서를 바꿔 기술하기만 해도 해결되기도 합니다.
하지만 이건 진정한 해결방법이 아닐듯 하네요.
================================================================
나름 테스트 결과
1. 10g : 조건의 기술 순서에 따라 에러 발생여부 결정됨
2. 11g : 조건의 기술 순서와 상관없이 에러 발생 안함..(신기하네~)
================================================================
알파벳을 삭제하고 숫자비교하는 하나의 조건으로 통합해 보세요.
WHERE TO_NUMBER(REGEXP_REPLACE(atwrt, '[[:alpha:]]'))
      BETWEEN TO_NUMBER('2') AND TO_NUMBER('5')

마농(manon94)님이 2012-08-09 11:41에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39589업데이트 처리 시 처리 지연 문제 [3]
강가딘
2012-08-10
5735
39588SQL 조언 부탁합니다. [1]
아무개
2012-08-10
4277
39586데이터 삭제시 조건절에 index가 걸리는 건지? [1]
짜집기
2012-08-09
4069
39585문자형으로 입력된 값에서 숫자 형태로 입력된 데이터만 조회가 가능할까요 ? [3]
이솔렛
2012-08-09
6034
39584카운트를 해야하는데 쿼리로 가능할까요?? [5]
이용헌
2012-08-08
5925
39583ROLLUP사용법 [1]
궁금
2012-08-08
5424
39581오라클 입문 왕초보입니다... 좀 알려주세요..
막바지
2012-08-07
4316
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다