我正在尝试为我的查询计算与某人相关的项目,但我一直在
ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
这是我的问题:
select distinct
p.person_id as id,
p.fullname as name,
p.email,
(select count(*) from ASSETS_MASTER m, PERSON p where m.asset_user = p.person_id) as Assets,
p.last_updated
from person p
where p.deleted = 0
order by p.fullname asc;
错误是因为:
select count(*) from ASSETS_MASTER m, PERSON p where m.asset_user = p.person_id
在这种情况下:
asset_user是数据类型varchar2(255)
person_id是数据类型编号
但如果我跑
select asset_id from ASSETS_MASTER m, PERSON p where m.asset_user = p.person_id
这将显示
的结果CFRI1823m
5384w
CFRI5039
CFRI2319
CFRI5024
....
有人能告诉我这个错误是什么吗?
答案 0 :(得分:0)
进一步说明我在评论中提出的观点,即:
我们无法看到您的数据。你也许正在尝试 将字符串(
m.asset_user
)与数字(p.person_id
)进行比较,或 那种性质的东西?
以下是使用标准HR模式中的EMPLOYEES和DEPARTMENTS表的类似示例(在大多数Oracle系统上,默认情况下,安装后存在):
select count(*) from hr.employees e, hr.departments d
where e.department_id = d.department_name;
ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
答案 1 :(得分:0)
Mathguy在上面的评论中有一个有趣的解释。我不知道为什么将asset_user作为VARCHAR(如果它是一个数字),如果可以的话,您可能需要考虑修改数据类型。但是,如果可以键入转换为数字(即您的asset_user没有像AD34
这样的值),您应该可以通过执行以下操作来修复查询:
select count(*) from ASSETS_MASTER m, PERSON p
where CAST(m.asset_user AS INT) = p.person_id
答案 2 :(得分:0)
你可以试试这个:
select count(*) from ASSETS_MASTER m, PERSON p where m.asset_user = '' || p.person_id
但它会阻止使用p.person_id的索引 在这种情况下,您必须创建to_char(person_id)
的功能索引直接回答您的问题 - 在您的查询中,Oracle隐式调用to_number以获取varchar m.asset_user。它工作正常,直到m.asset_user分配给类似' 12345'或者无效甚至是......但是一旦遇到类似于' 1 23' - 它返回无效的数字。