如果我的值无效,我有以下代码返回错误消息。如果给定的值不是数字,我想给出相同的错误消息。
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 ...
答案 0 :(得分:21)
REGEXP_LIKE(column, '^[[:digit:]]+$')
如果列仅包含数字字符,则返回TRUE
答案 1 :(得分:14)
没有内置功能。你可以写一个
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 )
答案 2 :(得分:10)
从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 :(得分:4)
您可以使用以下正则表达式,它将匹配整数(例如123
),浮点数(12.3
)和数字与指数(1.2e3
):
^-?\d*\.?\d+([eE]-?\d+)?$
如果您想接受+
符号以及-
符号(正如Oracle对TO_NUMBER()
所做的那样),您可以将上面-
的每个匹配项更改为{{{ 1}}。因此,您可以按如下方式重写上面的代码块:
[+-]
我并不完全确定会处理所有值,因此您可能希望添加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所示。
答案 4 :(得分:2)
我在互联网上找到的最佳答案:
SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
then 'numeric'
else 'alpha'
end
FROM tab1;
答案 5 :(得分:0)
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;
/
答案 6 :(得分:0)
SELECT DECODE(REGEXP_COUNT(:value,'\d'),LENGTH(:value),'Y','N') AS is_numeric FROM dual;
有很多方法,但这个对我来说很完美。
答案 7 :(得分:0)
这个正则表达式将匹配像 5 , -5, +5, 5.44, 3.45e-3 之类的数字
REGEXP_LIKE('54.55e33', '^[+-]?\d+([.]\d+)?(e[+-]?\d+)?$')