2015-03-02 136 views
9

我有以下代码,如果我的值无效,它将返回一条错误消息。如果给定的值不是数字,我想给出相同的错误信息。如何判断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 ... 

回答

10

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

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) 
+1

我想你想'is_numeric(STR)= 0'上面,如果我理解正确的OP('!ISNUMERIC(值)'的当量)。 – 2015-03-03 12:47:57

+1

@DavidFaber - 我认为这是一个错字。如果一个字符串不是数字,那么将它与数字值进行比较是没有意义的。 – 2015-03-03 20:23:20

+1

哦,我明白了,你在使用AND的地方有OP。 Mea culpa。 – 2015-03-03 21:00:01

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

返回TRUE,如果列只保存数字字符

+3

当然,并不是所有的数字都完全由数字组成。 “1.2”是数字,但包含句点(或逗号取决于您的NLS设置)。 “-100”是数字,但它包含一个减号。尽管它完全由数字和句点组成,但“1.2.3”不是数字。 'regexp_like'可能就足够了,如果你真的想看看这个列是否持有没有格式的正整数。 – 2015-03-02 22:21:51

+1

'123e-5'也是一个数字。 – 2015-03-02 22:26:37

+1

这个正则表达式只覆盖正整数值! – 2015-03-03 07:15:34

2

您可以使用以下正则表达式wh ICH将匹配整数(如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块或@JustinCave建议编写自定义to_number()功能。

5

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;