programing

Oracle에서 값이 숫자가 아닌지 어떻게 알 수 있습니까?

kakaobank 2023. 3. 23. 22:54
반응형

Oracle에서 값이 숫자가 아닌지 어떻게 알 수 있습니까?

값이 유효하지 않은 경우 오류 메시지를 반환하는 코드는 다음과 같습니다.주어진 값이 숫자가 아닐 경우 동일한 오류 메시지를 보내고 싶습니다.

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 ...
REGEXP_LIKE(column, '^[[:digit:]]+$')

열에 숫자 문자만 포함된 경우 TRUE를 반환합니다.

부터Oracle DB 12c Release 2VALIDATE_CONVERVION 함수를 사용할 수 있습니다.

VALIDE_CONVERVISION은 expr을 지정된 데이터 유형으로 변환할 수 있는지 여부를 결정합니다.expr을 정상적으로 변환할 수 있으면 이 함수는 1을 반환합니다.그렇지 않으면 이 함수는 0을 반환합니다.expr이 null로 평가되면 이 함수는 1을 반환합니다.expr 평가 중 오류가 발생하면 이 함수는 오류를 반환합니다.

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

db <> 데모 표시

내장된 기능은 없습니다.쓸 수 있다

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 )

Oracle 12.2 이후를 사용하고 있는 경우,to_number활용할 수 있는 기능

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

인터넷에서 찾은 최고의 답변:

SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
            then 'numeric'
            else 'alpha'
       end
FROM tab1;

정수와 일치하는 다음 정규식을 사용할 수 있습니다(예:123부동소수점수( )12.3및 지수( )가 있는 숫자입니다.1.2e3):

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

승낙을 원하신다면+징후와 더불어-(Oracle의 경우와 마찬가지로)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;

모든 값을 처리할 수 있을지는 잘 모르기 때문에 추가하기를 원할 수 있습니다.EXCEPTION관습을 막거나 쓰다to_number()@JustinCave가 제안하는 대로 기능합니다.

이 정규 표현은 5, -5, +5, 5.44, 3.45e-3 등의 숫자와 일치합니다.

REGEXP_LIKE('54.55e33', '^[+-]?\d+([.]\d+)?(e[+-]?\d+)?$')
CREATE OR REPLACE FUNCTION IS_NUMERIC(P_INPUT IN VARCHAR2) RETURN INTEGER IS
  RESULT INTEGER;
  NUM NUMBER ;
BEGIN
  NUM:=TO_NUMBER(P_INPUT);
  RETURN 1;
EXCEPTION WHEN OTHERS THEN
  RETURN 0;
END IS_NUMERIC;
/
SELECT DECODE(REGEXP_COUNT(:value,'\d'),LENGTH(:value),'Y','N') AS is_numeric FROM dual;

여러 가지 방법이 있지만, 이것은 나에게 딱 맞습니다.

언급URL : https://stackoverflow.com/questions/28819709/how-can-you-tell-if-a-value-is-not-numeric-in-oracle

반응형