복붙노트

[SQL] 값이 오라클에 숫자가 아닌 경우 어떻게 알 수 있습니까?

SQL

값이 오라클에 숫자가 아닌 경우 어떻게 알 수 있습니까?

나는 나의 값이 유효하지 않은 경우 오류 메시지를 반환합니다 다음과 같은 코드가 있습니다. 주어진 값이 숫자가 아닌 경우 저도 같은 오류 메시지를주고 싶습니다.

IF(option_id = 0021) THEN 
      IF((value<10000) or (value>7200000) or /* Numeric Check */)THEN
          ip_msg(6214,option_name);  -- Error Message
          return;
      END IF;
END IF;      

SQL Server에서 단순히 ISNUMERIC을 사용 (). 나는 오라클에서 비슷한 일을하고 싶습니다. 등과 같은

IF((!ISNUMERIC(value)) or (value<10000) or (value>7200000))
    THEN ...

해결법

  1. ==============================

    1.

    REGEXP_LIKE(column, '^[[:digit:]]+$')
    

    열이 숫자 만 보유하고있는 경우에 true를 돌려줍니다

  2. ==============================

    2.오라클 DB의 12C 출시 2에서 당신은 VALIDATE_CONVERSION 기능을 사용할 수 있습니다 :

    오라클 DB의 12C 출시 2에서 당신은 VALIDATE_CONVERSION 기능을 사용할 수 있습니다 :

     IF (VALIDATE_CONVERSION(value AS NUMBER) = 1) THEN
         ...
     END IF;
    

    DB <> 바이올린 데모

  3. ==============================

    3.어떤이 내장되지-에있는 기능. 당신은 하나를 쓸 수

    어떤이 내장되지-에있는 기능. 당신은 하나를 쓸 수

    CREATE FUNCTION is_numeric( p_str IN VARCHAR2 )
      RETURN NUMBER
    IS
      l_num NUMBER;
    BEGIN
      l_num := to_number( p_str );
      RETURN 1;
    EXCEPTION
      WHEN value_error
      THEN
        RETURN 0;
    END;
    

    및 / 또는

    CREATE FUNCTION my_to_number( p_str IN VARCHAR2 )
      RETURN NUMBER
    IS
      l_num NUMBER;
    BEGIN
      l_num := to_number( p_str );
      RETURN l_num;
    EXCEPTION
      WHEN value_error
      THEN
        RETURN NULL;
    END;
    

    당신은 할 수있다

    IF( is_numeric( str ) = 1 AND 
        my_to_number( str ) >= 1000 AND
        my_to_number( str ) <= 7000 )
    

    당신은 오라클 12.2를 사용하는 일이 이상, 당신이 활용할 수 있다는 TO_NUMBER 함수에 대한 개선 사항이있는 경우

    IF( to_number( str default null on conversion error ) >= 1000 AND
        to_number( str default null on conversion error ) <= 7000 )
    
  4. ==============================

    4.당신은 정수를 일치 다음과 같은 정규 표현식을 사용할 수 있습니다 (예를 들어, 123) 지수와 부동 소수점 수 (12.3), 숫자 (1.2e3) :

    당신은 정수를 일치 다음과 같은 정규 표현식을 사용할 수 있습니다 (예를 들어, 123) 지수와 부동 소수점 수 (12.3), 숫자 (1.2e3) :

    ^-?\d*\.?\d+([eE]-?\d+)?$
    

    당신이 + 표시뿐만 아니라 동의 할 경우 - [+ -]에 위 - 징후 (오라클 TO_NUMBER와 마찬가지로 ()), 당신은 각각의 발생을 변경할 수 있습니다. 다음과 같이 위의 코드의 당신의 블록을 다시 작성할 수 있도록 :

    IF (option_id = 0021) THEN 
        IF NOT REGEXP_LIKE(value, '^[+-]?\d*\.?\d+([eE][+-]?\d+)?$') OR TO_NUMBER(value) < 10000 OR TO_NUMBER(value) > 7200000 THEN
            ip_msg(6214,option_name);
            RETURN;
        END IF;
    END IF;
    

    난 당신이 예외 블록을 추가하거나 @JustinCave에서 알 수 있듯이 사용자 정의 TO_NUMBER () 함수를 작성 할 수 있도록 모든 값을 처리 할 것이라고 모두 특정 아닙니다.

  5. ==============================

    5.내가 인터넷에서 찾을 수있는 가장 좋은 답 :

    내가 인터넷에서 찾을 수있는 가장 좋은 답 :

    SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
                then 'numeric'
                else 'alpha'
           end
    FROM tab1;
    
  6. from https://stackoverflow.com/questions/28819709/how-can-you-tell-if-a-value-is-not-numeric-in-oracle by cc-by-sa and MIT license