check if “it's a number” function in Oracle

后端 未结 16 2597
一整个雨季
一整个雨季 2020-11-28 10:31

I\'m trying to check if a value from a column in an oracle (10g) query is a number in order to compare it. Something like:

select case when ( is_number(myTab         


        
相关标签:
16条回答
  • 2020-11-28 10:48

    You can use this example

    SELECT NVL((SELECT 1 FROM  DUAL WHERE   REGEXP_LIKE (:VALOR,'^[[:digit:]]+$')),0) FROM DUAL;
    
    0 讨论(0)
  • 2020-11-28 10:50

    One additional idea, mentioned here is to use a regular expression to check:

    SELECT  foo 
    FROM    bar
    WHERE   REGEXP_LIKE (foo,'^[[:digit:]]+$');
    

    The nice part is you do not need a separate PL/SQL function. The potentially problematic part is that a regular expression may not be the most efficient method for a large number of rows.

    0 讨论(0)
  • 2020-11-28 10:51
    CREATE OR REPLACE FUNCTION is_number(N IN VARCHAR2) RETURN NUMBER IS
      BEGIN
        RETURN CASE regexp_like(N,'^[\+\-]?[0-9]*\.?[0-9]+$') WHEN TRUE THEN 1 ELSE 0 END;
    END is_number;
    

    Please note that it won't consider 45e4 as a number, But you can always change regex to accomplish the opposite.

    0 讨论(0)
  • 2020-11-28 10:53

    well, you could create the is_number function to call so your code works.

    create or replace function is_number(param varchar2) return boolean
     as
       ret number;
     begin
        ret := to_number(param);
        return true;
     exception
        when others then return false;
     end;
    

    EDIT: Please defer to Justin's answer. Forgot that little detail for a pure SQL call....

    0 讨论(0)
  • 2020-11-28 10:55

    How is the column defined? If its a varchar field, then its not a number (or stored as one). Oracle may be able to do the conversion for you (eg, select * from someTable where charField = 0), but it will only return rows where the conversion holds true and is possible. This is also far from ideal situation performance wise.

    So, if you want to do number comparisons and treat this column as a number, perhaps it should be defined as a number?

    That said, here's what you might do:

    create or replace function myToNumber(i_val in varchar2) return number is
     v_num number;
    begin
     begin
       select to_number(i_val) into v_num from dual;
     exception
       when invalid_number then
       return null;
     end;
     return v_num;
    end;
    

    You might also include the other parameters that the regular to_number has. Use as so:

    select * from someTable where myToNumber(someCharField) > 0;
    

    It won't return any rows that Oracle sees as an invalid number.

    Cheers.

    0 讨论(0)
  • 2020-11-28 10:56

    if condition is null then it is number

    IF(rtrim(P_COD_LEGACY, '0123456789') IS NULL) THEN
                    return 1;
              ELSE
                    return 0;
              END IF;
    
    0 讨论(0)
提交回复
热议问题