在 Oracle 中如何判断一个值是否不是数字?
How can you tell if a value is not numeric in Oracle?
我有以下代码,如果我的值无效,returns 会显示一条错误消息。如果给定的值不是数字,我想给出相同的错误消息。
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服务器中,我简单地使用了ISNUMERIC()
。我想在 Oracle 中做类似的事情。例如,
IF((!ISNUMERIC(value)) or (value<10000) or (value>7200000))
THEN ...
没有内置函数。你可以写一个
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;
and/or
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 )
REGEXP_LIKE(column, '^[[:digit:]]+$')
returns 如果列仅包含数字字符则为 TRUE
您可以使用以下正则表达式来匹配整数(例如,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 建议的那样。
从 Oracle DB 12c Release 2
开始,您可以使用 VALIDATE_CONVERSION 函数:
VALIDATE_CONVERSION determines whether expr can be converted to the specified data type. If expr can be successfully converted, then this function returns 1; otherwise, this function returns 0. If expr evaluates to null, then this function returns 1. If an error occurs while evaluating expr, then this function returns the error.
IF (VALIDATE_CONVERSION(value AS NUMBER) = 1) THEN
...
END IF;
我在网上找到的最佳答案:
SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
then 'numeric'
else 'alpha'
end
FROM tab1;
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;
/
SELECT DECODE(REGEXP_COUNT(:value,'\d'),LENGTH(:value),'Y','N') AS is_numeric FROM dual;
方法有很多种,但这个最适合我。
此正则表达式将匹配数字 5 、-5、+5、5.44、3.45e-3
REGEXP_LIKE('54.55e33', '^[+-]?\d+([.]\d+)?(e[+-]?\d+)?$')
我有以下代码,如果我的值无效,returns 会显示一条错误消息。如果给定的值不是数字,我想给出相同的错误消息。
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服务器中,我简单地使用了ISNUMERIC()
。我想在 Oracle 中做类似的事情。例如,
IF((!ISNUMERIC(value)) or (value<10000) or (value>7200000))
THEN ...
没有内置函数。你可以写一个
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;
and/or
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 )
REGEXP_LIKE(column, '^[[:digit:]]+$')
returns 如果列仅包含数字字符则为 TRUE
您可以使用以下正则表达式来匹配整数(例如,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 建议的那样。
从 Oracle DB 12c Release 2
开始,您可以使用 VALIDATE_CONVERSION 函数:
VALIDATE_CONVERSION determines whether expr can be converted to the specified data type. If expr can be successfully converted, then this function returns 1; otherwise, this function returns 0. If expr evaluates to null, then this function returns 1. If an error occurs while evaluating expr, then this function returns the error.
IF (VALIDATE_CONVERSION(value AS NUMBER) = 1) THEN
...
END IF;
我在网上找到的最佳答案:
SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
then 'numeric'
else 'alpha'
end
FROM tab1;
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;
/
SELECT DECODE(REGEXP_COUNT(:value,'\d'),LENGTH(:value),'Y','N') AS is_numeric FROM dual;
方法有很多种,但这个最适合我。
此正则表达式将匹配数字 5 、-5、+5、5.44、3.45e-3
REGEXP_LIKE('54.55e33', '^[+-]?\d+([.]\d+)?(e[+-]?\d+)?$')