SELECT * FROM ( SELECT '·' A FROM DUAL --방점 UNION ALL SELECT '.' A FROM DUAL --소수점 UNION ALL SELECT '/' A FROM DUAL --소수점 UNION ALL SELECT '1' A FROM DUAL UNION ALL SELECT '1' A FROM DUAL UNION ALL SELECT '99' A FROM DUAL UNION ALL SELECT '101' A FROM DUAL ) WHERE A <> '·' -- 방점이 아닌것 AND A NOT BETWEEN '0' AND '100' 쿼리를 조회 하면 결과값이 A . 99 101 나옵니다 A값은 VARCHAR 로 되어 있습니다. BETWEED으로 조회 하면 되지 않는가여? 방점 '·' 값이 아니고 0~100 사이 값이 아닌값을 구하고 싶습니다. 어떤식으로 변경해야 하는지 궁금합니다.
SELECT * FROM ( SELECT '·' A FROM DUAL --방점 UNION ALL SELECT '.' A FROM DUAL --소수점 UNION ALL SELECT '1' A FROM DUAL UNION ALL SELECT '1' A FROM DUAL UNION ALL SELECT '99' A FROM DUAL UNION ALL SELECT '101' A FROM DUAL ) WHERE CASE WHEN A = '·' THEN 0 WHEN A = '.' THEN 1 WHEN TO_NUMBER(A) BETWEEN 0 AND 100 THEN 0 ELSE 1 END = 1
SELECT A FROM (SELECT '·' A FROM DUAL UNION ALL --방점 SELECT '.' A FROM DUAL UNION ALL --소수점 SELECT '*' A FROM DUAL UNION ALL SELECT '1' A FROM DUAL UNION ALL SELECT '1' A FROM DUAL UNION ALL SELECT '99' A FROM DUAL UNION ALL SELECT '101' A FROM DUAL UNION ALL SELECT '99.999' A FROM DUAL UNION ALL SELECT '101.111' A FROM DUAL UNION ALL SELECT '-101.111' A FROM DUAL ) WHERE CASE WHEN REGEXP_LIKE(A, '[[:digit:]]') AND TRUNC(TO_NUMBER(A)) NOT BETWEEN 0 AND 100 THEN 1 WHEN A = '.' THEN 1 ELSE 0 END = 1
BETWEEN '0' AND '100' 으로는 숫자 범위를 구할 수 없습니다.
BETWEEN 0 AND 100 해야지만 숫자 범위를 구할 수 있습니다.
하지만 문자컬럼에 숫자가 아닌 다른 값도 함께 저장된 구조이므로 숫자 조건을 쓸 수 없습니다.
이런 경우엔 전략을 잘 세워야 하는데요.
전략을 세우기 위해서는 우선 자료를 분석해야 합니다.
어떤 값들이 어떤 형태로 들어오는지 모든 케이스를 알아야 합니다.
특수문자는 방점과 소수점 두개 뿐인 것인지?
숫자 자료는 0 ~ 100 을 벗어나는 자료도 존재하는지?
숫자 자료중 소수점을 포함하거나 음수(-)인 자료도 존재하는지?
최종 원하는 결과가 무엇인지? 등을 명확하게 하셔야 합니다.
WITH t AS ( SELECT '·' a FROM dual -- 방점 UNION ALL SELECT '.' FROM dual -- 소수점 UNION ALL SELECT ' ' FROM dual -- 공백 UNION ALL SELECT '+' FROM dual -- 더하기 UNION ALL SELECT '-1' FROM dual -- 음수 UNION ALL SELECT '0' FROM dual UNION ALL SELECT '1' FROM dual UNION ALL SELECT '99' FROM dual UNION ALL SELECT '101' FROM dual UNION ALL SELECT '0.999' FROM dual -- 소수 UNION ALL SELECT '1E7' FROM dual -- 지수 UNION ALL SELECT '+1.234E5' FROM dual -- 지수 UNION ALL SELECT '.123' FROM dual -- 소수 ) SELECT * FROM (SELECT a , CASE WHEN REGEXP_LIKE(a, '^[+-]?([0-9]+([.][0-9]+)?|[.][0-9]+)(E[0-9]+)?$') THEN 1 ELSE 0 END x -- 숫자 여부 FROM t ) WHERE DECODE(x, 0, a) != '·' OR DECODE(x, 1, a) NOT BETWEEN 0 AND 100 ;