检查Oracle中的"它是否为数字"功能

Fgb*_*nch 35 oracle plsql oracle10g

我正在尝试检查oracle(10g)查询中的列中的值是否为数字以便进行比较.就像是:

select case when ( is_number(myTable.id) and (myTable.id >0) ) 
            then 'Is a number greater than 0' 
            else 'it is not a number' 
       end as valuetype  
  from table myTable
Run Code Online (Sandbox Code Playgroud)

关于如何检查的任何想法?

Sai*_*ish 61

这里提到的另一个想法是使用正则表达式来检查:

SELECT  foo 
FROM    bar
WHERE   REGEXP_LIKE (foo,'^[[:digit:]]+$');
Run Code Online (Sandbox Code Playgroud)

好的部分是你不需要单独的PL/SQL函数.可能存在问题的部分是正则表达式可能不是大量行的最有效方法.

  • 要包含否定,请使用REGEXP_LIKE(foo,'^ - ?[[:digit]] + $')要匹配浮点数,请参阅Matt Byrnes答案. (8认同)

Jus*_*ave 32

假设ID列myTable未被声明为NUMBER(这似乎是一个奇怪的选择并且可能有问题),您可以编写一个函数,尝试将(可能是VARCHAR2)ID转换为数字,捕获异常,并且返回'Y'或'N'.就像是

CREATE OR REPLACE FUNCTION is_number( p_str IN VARCHAR2 )
  RETURN VARCHAR2 DETERMINISTIC PARALLEL_ENABLE
IS
  l_num NUMBER;
BEGIN
  l_num := to_number( p_str );
  RETURN 'Y';
EXCEPTION
  WHEN value_error THEN
    RETURN 'N';
END is_number;
Run Code Online (Sandbox Code Playgroud)

然后,您可以在查询中嵌入该调用,即

SELECT (CASE WHEN is_number( myTable.id ) = 'Y' AND myTable.id > 0 
               THEN 'Number > 0'
             ELSE 'Something else'
         END) some_alias
  FROM myTable
Run Code Online (Sandbox Code Playgroud)

请注意,尽管PL/SQL具有布尔数据类型,但SQL不具有.因此,虽然您可以声明一个返回布尔值的函数,但您不能在SQL查询中使用这样的函数.

  • @eyetea - 个人喜好.你当然可以返回0或1.如果开发人员都是英语口语,我倾向于选择Y和N而不是因为那更加自我记录.如果你正在处理更多的国际发展,那么通过将语言排除在外,0和1更有意义. (3认同)

Mat*_*rne 15

Saish使用的答案REGEXP_LIKE是正确的想法,但不支持浮动数字.这个会......

返回数值

SELECT  foo 
FROM    bar
WHERE   REGEXP_LIKE (foo,'^-?\d+(\.\d+)?$');
Run Code Online (Sandbox Code Playgroud)

返回值不是数字

SELECT  foo 
FROM    bar
WHERE   NOT REGEXP_LIKE (foo,'^-?\d+(\.\d+)?$');
Run Code Online (Sandbox Code Playgroud)

您可以自己测试您的正则表达式,直到您的心满意为止http://regexpal.com/ (但请确保换行符中选中复选框匹配).


小智 5

你可以在ORACLE(10g)中使用正则表达式函数'regexp_like',如下所示:

select case
       when regexp_like(myTable.id, '[[:digit:]]') then
        case
       when myTable.id > 0 then
        'Is a number greater than 0'
       else
        'Is a number less than or equal to 0'
     end else 'it is not a number' end as valuetype
from table myTable
Run Code Online (Sandbox Code Playgroud)


kev*_*ned 5

这是查找Oracle中不包含数字数据的行的潜在副本.另请参阅:如何确定SQL中的字符串是否为数字?.

这是一个基于Michael Durrant的解决方案,适用于整数.

SELECT foo
FROM bar
WHERE DECODE(TRIM(TRANSLATE(your_number,'0123456789',' ')), NULL, 'number','contains char') = 'number'
Run Code Online (Sandbox Code Playgroud)

Adrian Carneiro发布了一个适用于小数和其他的解决方案.然而,正如Justin Cave指出的那样,这将错误地将字符串分类为'123.45.23.234'或'131 + 234'.

SELECT foo
FROM bar
WHERE DECODE(TRIM(TRANSLATE(your_number,'+-.0123456789',' ')), NULL, 'number','contains char') = 'number'
Run Code Online (Sandbox Code Playgroud)

如果您需要没有PL/SQL或REGEXP_LIKE的解决方案,这可能会有所帮助.