sql - 为什么 Oracle 不将字符转换为数字?
问题描述
Oracle 抛出ORA-01722: invalid number
了我的 SQL 查询,目前还不清楚原因。
我有一个名为“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
可能出了什么问题?
解决方案
唉,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
推荐阅读
- html - 如何在框中定位元素?
- matlab - MATLAB 数组和容器
- azure - 如何替换现有 azure 帐户上的组织电子邮件 ID
- apache - XAMPP localhost 工作后显示黑色
- android - 如何从 Riverpod 中的另一个提供者修改 StateNotifier 提供者的状态?
- javascript - 使用 Javascript 输出更新 Shiny UI 布局
- python - 存储文件 Django
- ios - iOS:应用程序验证 - 由于应用程序扩展包 ID 格式,包标识符错误
- ios - 为什么 kingfisher 使用 md5 创建 cacheFileName?
- python - Powershell将所有下载移动到另一个文件夹功能