Oracle在我的SQL查询中抛出了ORA-01722: invalid number
,目前尚不清楚原因。
我有一个名为“ LIGHTS”的表,我想使用WATTAGE <= 3来获取灯光。出于某种原因,WATTAGE以VARCHAR2(40)的形式存储,但是每个字符似乎都是整数或浮点数。当我使用查询将WATTAGE转换为数字时:
SELECT TO_NUMBER(WATTAGE) FROM LIGHTS
没问题。我得到这样的结果:
TO_NUMBER(WATTAGE)
1
7
-1
0
15
17.5
但是,当我添加WHERE条件以过滤小于3的数字时,会出现ORA-01722: invalid number
错误:
SELECT WATTAGE FROM LIGHTS
WHERE TO_NUMBER(WATTAGE) <= 3
出什么问题了?
答案 0 :(得分:1)
ORA-01722: invalid number
来自TO_NUMBER()
,而不是有条件的。即,尝试此操作,您将得到相同的错误:
SELECT TO_NUMBER('test') FROM dual;
这表示您的至少一个值不是数字。
答案 1 :(得分:1)
A,Oracle没有简单的方法来检查字符串是否实际上代表数字。 (首先使用正确数据类型的众多原因之一!)
但是,您可以编写自己的。这只是这个概念的简短演示。我用VARCHAR2数据类型的列创建一个表,并用一些字符串填充它,其中一个不是数字。
create table tbl (nbr varchar2(100));
insert into tbl
select '103' from dual union all
select '-1.3' from dual union all
select 'abc' from dual
;
然后,我创建一个带有嵌套块的小函数,如果TO_NUMBER
失败,该块应该出错。错误处理程序将“针对错误执行某些操作”,然后将控制权返回给主函数。然后,我可以在WHERE子句中使用它。这里是函数,然后是如何使用它来查找有问题的值:
create or replace function not_a_number(str varchar2)
return varchar2
as
x number;
r varchar2(100);
begin
begin
x := to_number(str);
exception
when others then
r := str;
end;
return r;
end;
/
select nbr
from tbl
where not_a_number(nbr) is not null;
NBR
-------
abc