web-dev-qa-db-ja.com

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()を使用しました。 Oracleでも似たようなことをしたいと思います。といった、

_IF((!ISNUMERIC(value)) or (value<10000) or (value>7200000))
    THEN ...
_
15
Kyle Williamson
REGEXP_LIKE(column, '^[[:digit:]]+$')

列に数字のみが含まれる場合にTRUEを返します

組み込み関数はありません。あなたは1つ書くことができます

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 )
14
Justin Cave

Oracle DB 12c Release 2から、VALIDATE_CONVERSION関数を使用できます。

VALIDATE_CONVERSIONは、exprを指定されたデータ型に変換できるかどうかを決定します。 exprを正常に変換できる場合、この関数は1を返します。それ以外の場合、この関数は0を返します。exprがnullと評価されると、この関数は1を返します。exprの評価中にエラーが発生すると、この関数はエラーを返します。

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

db <> fiddle demo

14
Lukasz Szozda

整数(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;

@JustinCaveが示唆しているように、EXCEPTIONブロックを追加したり、カスタムto_number()関数を記述したりすることがあります。

4
David Faber

インターネットで見つけた最高の答え:

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