Finding rows that don't contain numeric data in Oracle

前端 未结 9 557
陌清茗
陌清茗 2020-12-09 17:00

I am trying to locate some problematic records in a very large Oracle table. The column should contain all numeric data even though it is a varchar2 column. I need to find

相关标签:
9条回答
  • 2020-12-09 17:03

    Use this

    SELECT * 
    FROM TableToSearch 
    WHERE NOT REGEXP_LIKE(ColumnToSearch, '^-?[0-9]+(\.[0-9]+)?$');
    
    0 讨论(0)
  • 2020-12-09 17:06

    I was thinking you could use a regexp_like condition and use the regular expression to find any non-numerics. I hope this might help?!

    SELECT * FROM table_with_column_to_search WHERE REGEXP_LIKE(varchar_col_with_non_numerics, '[^0-9]+');
    
    0 讨论(0)
  • 2020-12-09 17:06

    After doing some testing, building upon the suggestions in the previous answers, there seem to be two usable solutions.

    Method 1 is fastest, but less powerful in terms of matching more complex patterns.
    Method 2 is more flexible, but slower.

    Method 1 - fastest
    I've tested this method on a table with 1 million rows.
    It seems to be 3.8 times faster than the regex solutions.
    The 0-replacement solves the issue that 0 is mapped to a space, and does not seem to slow down the query.

    SELECT *
    FROM <table>
    WHERE TRANSLATE(replace(<char_column>,'0',''),'0123456789',' ') IS NOT NULL;
    

    Method 2 - slower, but more flexible
    I've compared the speed of putting the negation inside or outside the regex statement. Both are equally slower than the translate-solution. As a result, @ciuly's approach seems most sensible when using regex.

    SELECT *
    FROM <table>
    WHERE NOT REGEXP_LIKE(<char_column>, '^[0-9]+$');
    
    0 讨论(0)
  • 2020-12-09 17:08

    You can use this one check:

    create or replace function to_n(c varchar2) return number is
    begin return to_number(c);
    exception when others then return -123456;
    end;
    
    select id, n from t where to_n(n) = -123456;
    
    0 讨论(0)
  • From http://www.dba-oracle.com/t_isnumeric.htm

    LENGTH(TRIM(TRANSLATE(, ' +-.0123456789', ' '))) is null
    

    If there is anything left in the string after the TRIM it must be non-numeric characters.

    0 讨论(0)
  • 2020-12-09 17:14

    After doing some testing, i came up with this solution, let me know in case it helps.

    Add this below 2 conditions in your query and it will find the records which don't contain numeric data

     and REGEXP_LIKE(<column_name>, '\D') -- this selects non numeric data
     and not REGEXP_LIKE(column_name,'^[-]{1}\d{1}') -- this filters out negative(-) values
    
    0 讨论(0)
提交回复
热议问题