42

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

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 ...
4

8 回答 8

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

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

于 2015-03-02T22:08:48.510 回答
34

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<>小提琴演示

于 2017-08-25T17:44:37.337 回答
15

没有内置功能。你可以写一个

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 )
于 2015-03-02T21:32:10.377 回答
10

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

SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
            then 'numeric'
            else 'alpha'
       end
FROM tab1;
于 2018-09-11T12:41:43.293 回答
6

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

于 2015-03-03T12:47:01.293 回答
1
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;
/
于 2020-09-28T12:20:21.823 回答
1

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

REGEXP_LIKE('54.55e33', '^[+-]?\d+([.]\d+)?(e[+-]?\d+)?$')
于 2021-04-11T18:11:51.990 回答
0
SELECT DECODE(REGEXP_COUNT(:value,'\d'),LENGTH(:value),'Y','N') AS is_numeric FROM dual;

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

于 2021-02-15T16:20:54.927 回答