ORACLE - TO_NUMBER功能

时间:2017-07-14 07:38:09

标签: sql oracle type-conversion

我的表格中有TEXT_INT列,我想使用TO_NUMBER函数转换为DECIMAL。不幸的是我得到了

  

INVALID NUMBER ORA-722错误。

我怀疑它可能有字符。因此发出以下查询,但TEXT_INT中没有字母。

SELECT * 
FROM NANTHA_TABLE 
WHERE UPPER(TEXT_INT) != LOWER(TEXT_INT);

请您提出解决此问题的方法或找到错误数据的方法吗?

3 个答案:

答案 0 :(得分:5)

试试这个:

创建这样的函数:

CREATE OR REPLACE function f_invalid_number(number_field in varchar2) return number as
  n_d number;
begin
  n_d := TO_number(number_field);
  return 0;
exception 
  when others then
    return 1;
end;
/

然后你可以检查这样的无效数据:

SELECT * 
FROM NANTHA_TABLE 
WHERE f_invalid_number(TEXT_INT) =1

答案 1 :(得分:0)

此查询可能会对您有所帮助。

select your_wrong_col ,
       case
          when trim(TRANSLATE(your_wrong_col ,'0123456789','')) is null
             then 'numeric'
             else 'not_numeric'
       end as your_wrong_col
from YOUR_TABLE
where trim(TRANSLATE(your_wrong_col ,'0123456789','')) is not null;

查找非数字行。

答案 2 :(得分:0)

请使用以下查询查找TEXT_INT列包含除数字以外的字符的记录。

select  * from NANTHA_TABLE  where NOT REGEXP_LIKE(TEXT_INT,'^[0-9]+$')

如果您希望列中的更多字符串符号应被视为有效,则可以将它们包含在NOT REGEXP_LIKE条件中,以便这些列也不会出现在查询中。

例如。如果在某些值的字符串开头期望一个' - '符号:

NOT REGEXP_LIKE(COLUMN_NAME, '^-?[0-9.]+$') "  

其中

  • '^'开始
  • '?'零或一次出现
  • '+'更多出现之一
  • '$'结束字符串

请注意我知道,即使计算了两次,上述查询中的小数也会被接受。为此,我提出了一个不同的解决方案来计算字符串中的小数位数并抛出错误。如果any1可以将它与REGEXP集成,那么非常欢迎。如何计算检查的小数位数。

 LENGTH(COLUMN_NAME) - LENGTH(REPLACE(COLUMN_NAME,'.','')) > 1

要查找有关REGEXP_LIKE的更多详细信息,请使用following link

相关问题