代码之家  ›  专栏  ›  技术社区  ›  Kyle Williamson

如何判断Oracle中的值是否不是数字?

  •  49
  • Kyle Williamson  · 技术社区  · 11 年前

    如果我的值无效,我有以下代码返回错误消息。如果给定的值不是数字,我希望给出相同的错误消息。

    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 ...
    
    8 回复  |  直到 5 年前
        1
  •  71
  •   Rob van Laarhoven    11 年前
    REGEXP_LIKE(column, '^[[:digit:]]+$')
    

    如果列仅包含数字字符,则返回TRUE

        2
  •  42
  •   Lukasz Szozda    7 年前

    从…起 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

        3
  •  18
  •   Justin Cave    6 年前

    没有内置函数。你可以写一个

    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 )
    
        4
  •  11
  •   TechDo    7 年前

    我在网上找到的最佳答案是:

    SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
                then 'numeric'
                else 'alpha'
           end
    FROM tab1;
    
        5
  •  6
  •   David Faber    11 年前

    您可以使用以下正则表达式来匹配整数(例如。, 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所建议的那样。

        6
  •  2
  •   Yasser Helmy    5 年前

    此正则表达式将匹配5、-5、+5、5.44、3.45e-3等数字

    REGEXP_LIKE('54.55e33', '^[+-]?\d+([.]\d+)?(e[+-]?\d+)?$')
    
        7
  •  1
  •   harun ugur    5 年前
    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;
    /
    
        8
  •  0
  •   KOBER    5 年前
    SELECT DECODE(REGEXP_COUNT(:value,'\d'),LENGTH(:value),'Y','N') AS is_numeric FROM dual;
    

    有很多种方法,但这一种对我来说很完美。