为什么Count不在我的oracle sql中工作

时间:2017-06-14 22:05:23

标签: sql oracle aggregate-functions

我正在尝试为我的查询计算与某人相关的项目,但我一直在

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
....

有人能告诉我这个错误是什么吗?

3 个答案:

答案 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' - 它返回无效的数字。