쿼리 질문 들립니다. 0 10 2,304

by 최영웅 [SQL Query] varchar between [2018.01.24 13:32:29]


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 사이 값이 아닌값을 구하고 싶습니다.

어떤식으로 변경해야 하는지 궁금합니다.

 

by 삐르짱 [2018.01.24 14:04:44]
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

 


by 최영웅 [2018.01.24 14:48:39]

답변 감사합니다.

혹시 특수문자 방점 ,소수점 말고 다른것이 들어 올경우 어떤식으로 빼내야하는지여?


by 삐르짱 [2018.01.24 15:46:52]
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

 


by 마농 [2018.01.24 14:09:03]

BETWEEN '0' AND '100' 으로는 숫자 범위를 구할 수 없습니다.
BETWEEN 0 AND 100 해야지만 숫자 범위를 구할 수 있습니다.
하지만 문자컬럼에 숫자가 아닌 다른 값도 함께 저장된 구조이므로 숫자 조건을 쓸 수 없습니다.
이런 경우엔 전략을 잘 세워야 하는데요.
전략을 세우기 위해서는 우선 자료를 분석해야 합니다.
어떤 값들이 어떤 형태로 들어오는지 모든 케이스를 알아야 합니다.
특수문자는 방점과 소수점 두개 뿐인 것인지?
숫자 자료는 0 ~ 100 을 벗어나는 자료도 존재하는지?
숫자 자료중 소수점을 포함하거나 음수(-)인 자료도 존재하는지?
최종 원하는 결과가 무엇인지? 등을 명확하게 하셔야 합니다.


by 최영웅 [2018.01.24 14:16:37]

특수문자도 어떤것이 들어 올찌 모르는 사항입니다.

숫자의 자료중 음수도 있을수 있고 100보다 더 큰 숫자도 있을수 있습니다.

A 컬럼은 VARCHAR 로 지정 되어 있어 변경이 어렵습니다.


by 마농 [2018.01.24 14:46:15]

특수문자가 2가지 뿐이라면? 삐르짱님 답변 참고하세요.


by 최영웅 [2018.01.24 14:48:00]

혹시 특수문자가 어떤것이 들어 올찌 모르는 사항이면 어떤식으로 구해야 하는지요

REGEXP_LIKE를 사용해서 정규식으로 찾아야 하는지여?


by 마농 [2018.01.24 15:02:56]

자료를 분석하여 가능한 모든 케이스를 분간해야 합니다.
숫자는 음수도 들어오는 듯 하고
혹시 소수도 들어 오나요?
숫자인지 아닌지를 분간해야 하고
숫자인 경우에만 숫자로 변환하여 between 조건을 줘야 합니다.
예시자료를 만들 때는 평범한 자료보다는 이런 특이한 자료들이 포함되어야 합니다.


by 최영웅 [2018.01.24 15:15:42]

소수점 생각을 안했네여 

자료 분석이 중요하다는것을 다시 한번 생각하게 되네여

예시를 좀더 명학하게 해야하는데

아 이것도한 배움에 길이네여 감사합니다.


by 마농 [2018.01.25 08:37:13]
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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입