Oracle为什么不将字符转换为数字?

时间:2019-02-14 17:01:42

标签: sql oracle

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

出什么问题了?

2 个答案:

答案 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
相关问题