sql—在oracle中,如何判断值是否不是数字?

waxmsbnn  于 2021-07-26  发布在  Java
关注(0)|答案(8)|浏览(446)

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

  1. IF(option_id = 0021) THEN
  2. IF((value<10000) or (value>7200000) or /* Numeric Check */)THEN
  3. ip_msg(6214,option_name); -- Error Message
  4. return;
  5. END IF;
  6. END IF;

在sql server中,我只使用 ISNUMERIC() . 我想在甲骨文中做一些类似的事情。比如,

  1. IF((!ISNUMERIC(value)) or (value<10000) or (value>7200000))
  2. THEN ...
w8biq8rn

w8biq8rn1#

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

如果列只包含数字字符,则返回true

rseugnpd

rseugnpd2#

Oracle DB 12c Release 2 您可以使用以下转换函数:
validate\u conversion确定是否可以将expr转换为指定的数据类型。如果expr可以成功转换,那么这个函数返回1;否则,此函数返回0。如果expr的计算结果为null,则此函数返回1。如果在计算expr时发生错误,则此函数返回错误。

  1. IF (VALIDATE_CONVERSION(value AS NUMBER) = 1) THEN
  2. ...
  3. END IF;

db<>小提琴演示

vshtjzan

vshtjzan3#

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

  1. CREATE FUNCTION is_numeric( p_str IN VARCHAR2 )
  2. RETURN NUMBER
  3. IS
  4. l_num NUMBER;
  5. BEGIN
  6. l_num := to_number( p_str );
  7. RETURN 1;
  8. EXCEPTION
  9. WHEN value_error
  10. THEN
  11. RETURN 0;
  12. END;

和/或

  1. CREATE FUNCTION my_to_number( p_str IN VARCHAR2 )
  2. RETURN NUMBER
  3. IS
  4. l_num NUMBER;
  5. BEGIN
  6. l_num := to_number( p_str );
  7. RETURN l_num;
  8. EXCEPTION
  9. WHEN value_error
  10. THEN
  11. RETURN NULL;
  12. END;

然后你就可以做了

  1. IF( is_numeric( str ) = 1 AND
  2. my_to_number( str ) >= 1000 AND
  3. my_to_number( str ) <= 7000 )

如果您碰巧使用的是oracle 12.2或更高版本,则 to_number 你可以利用的功能

  1. IF( to_number( str default null on conversion error ) >= 1000 AND
  2. to_number( str default null on conversion error ) <= 7000 )
展开查看全部
tez616oj

tez616oj4#

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

  1. SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
  2. then 'numeric'
  3. else 'alpha'
  4. end
  5. FROM tab1;
oknwwptz

oknwwptz5#

您可以使用以下正则表达式来匹配整数(例如。, 123 ),浮点数( 12.3 ),和带指数的数字( 1.2e3 ):

  1. ^-?\d*\.?\d+([eE]-?\d+)?$

如果你想接受 + 标志以及 - 符号(就像甲骨文对 TO_NUMBER() ),可以更改 - 上至 [+-] . 因此,您可以将上面的代码块重写如下:

  1. IF (option_id = 0021) THEN
  2. IF NOT REGEXP_LIKE(value, '^[+-]?\d*\.?\d+([eE][+-]?\d+)?$') OR TO_NUMBER(value) < 10000 OR TO_NUMBER(value) > 7200000 THEN
  3. ip_msg(6214,option_name);
  4. RETURN;
  5. END IF;
  6. END IF;

我不完全确定是否会处理所有值,因此您可能需要添加一个 EXCEPTION 阻止或写入自定义 to_number() 如@justincave所示。

wrrgggsh

wrrgggsh6#

  1. CREATE OR REPLACE FUNCTION IS_NUMERIC(P_INPUT IN VARCHAR2) RETURN INTEGER IS
  2. RESULT INTEGER;
  3. NUM NUMBER ;
  4. BEGIN
  5. NUM:=TO_NUMBER(P_INPUT);
  6. RETURN 1;
  7. EXCEPTION WHEN OTHERS THEN
  8. RETURN 0;
  9. END IS_NUMERIC;
  10. /
0s7z1bwu

0s7z1bwu7#

  1. SELECT DECODE(REGEXP_COUNT(:value,'\d'),LENGTH(:value),'Y','N') AS is_numeric FROM dual;

有很多方法,但这一个适合我。

u7up0aaq

u7up0aaq8#

这个正则表达式将匹配像5、-5、+5、5.44、3.45e-3这样的数字

  1. REGEXP_LIKE('54.55e33', '^[+-]?\d+([.]\d+)?(e[+-]?\d+)?$')

相关问题