我的表格中有TEXT_INT
列,我想使用TO_NUMBER函数转换为DECIMAL。不幸的是我得到了
INVALID NUMBER ORA-722错误。
我怀疑它可能有字符。因此发出以下查询,但TEXT_INT
中没有字母。
SELECT *
FROM NANTHA_TABLE
WHERE UPPER(TEXT_INT) != LOWER(TEXT_INT);
请您提出解决此问题的方法或找到错误数据的方法吗?
答案 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。