如何判断Oracle中的值是否不是数值?

Kyl*_*son 17 sql oracle isnumeric

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

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;      
Run Code Online (Sandbox Code Playgroud)

在SQL Server中,我只是使用了ISNUMERIC().我想在Oracle中做类似的事情.如,

IF((!ISNUMERIC(value)) or (value<10000) or (value>7200000))
    THEN ...
Run Code Online (Sandbox Code Playgroud)

Rob*_*ebe 26

REGEXP_LIKE(column, '^[[:digit:]]+$')
Run Code Online (Sandbox Code Playgroud)

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

  • 当然,并非所有数字都完全由数字字符组成."1.2"是数字,但它包含句点(或逗号,具体取决于您的NLS设置)."-100"是数字,但它包含减号."1.2.3"虽然完全由数字和句点组成,但不是数字.如果你真的想看看列是否保持没有格式化的正整数,那么`regexp_like`就足够了. (4认同)
  • `123e-5` 也是一个数字。 (2认同)
  • 这个正则表达式将只涵盖正整数值! (2认同)

Jus*_*ave 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;
Run Code Online (Sandbox Code Playgroud)

和/或

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;
Run Code Online (Sandbox Code Playgroud)

然后你可以做

IF( is_numeric( str ) = 1 AND 
    my_to_number( str ) >= 1000 AND
    my_to_number( str ) <= 7000 )
Run Code Online (Sandbox Code Playgroud)


Luk*_*zda 14

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;
Run Code Online (Sandbox Code Playgroud)

db <>小提琴演示

  • 哦,伙计...我一直在寻找这个功能好几个月了。这是一个巨大的帮助!谢谢。 (2认同)

Tec*_*hDo 7

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

SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
            then 'numeric'
            else 'alpha'
       end
FROM tab1;
Run Code Online (Sandbox Code Playgroud)


Dav*_*ber 5

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

^-?\d*\.?\d+([eE]-?\d+)?$
Run Code Online (Sandbox Code Playgroud)

如果您想同时接受+符号和-符号(就像 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;
Run Code Online (Sandbox Code Playgroud)

我并不完全确定会处理所有值,因此您可能想要添加一个EXCEPTION块或编写一个自定义to_number()函数,如@JustinCave 建议的那样。