为什么';我的oracle sql中没有计算工作
我试图为我的查询统计与某人相关的项目,但我一直得到一个为什么';我的oracle sql中没有计算工作,sql,oracle,aggregate-functions,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.e
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
在这种情况下:
资产用户是数据类型varchar2(255)
person\u id是数据类型编号
但如果我跑
select asset_id from ASSETS_MASTER m, PERSON p where m.asset_user = p.person_id
这将显示测试结果
CFRI1823m
5384w
CFRI5039
CFRI2319
CFRI5024
....
有人能告诉我这个错误是怎么回事吗?为了进一步说明我在评论中的观点,我的评论是:
如果不查看您的数据,我们无法判断。你是不是想 将字符串(
m.asset\u user
)与数字(p.person\u id
)进行比较,或
那种性质的东西
下面是一个使用标准HR模式中的EMPLOYEES和DEPARTMENTS表的类似示例(在大多数Oracle系统上安装后默认存在):
为了进一步说明我在评论中提出的观点,该评论是:
如果不查看您的数据,我们无法判断。你是不是想 将字符串(
m.asset\u user
)与数字(p.person\u id
)进行比较,或
那种性质的东西
下面是一个使用标准HR模式中的EMPLOYEES和DEPARTMENTS表的类似示例(在大多数Oracle系统上安装后默认存在):
Mathguy在上面的评论中有一个有趣的解释。我不知道为什么你的AsSeTube用户是VARCHAR,如果它是一个数字,你可能想考虑修改数据类型,如果可以的话。但是,如果可以键入convert to a number(即,您的asset_用户没有像
AD34
这样的值),您应该能够通过执行以下操作修复查询:
select count(*) from ASSETS_MASTER m, PERSON p
where CAST(m.asset_user AS INT) = p.person_id
Mathguy在上面的评论中有一个有趣的解释。我不知道为什么你的AsSeTube用户是VARCHAR,如果它是一个数字,你可能想考虑修改数据类型,如果可以的话。但是,如果可以键入convert to a number(即,您的asset_用户没有像
AD34
这样的值),您应该能够通过执行以下操作修复查询:
select count(*) from ASSETS_MASTER m, PERSON p
where CAST(m.asset_user AS INT) = p.person_id
您可以尝试以下方法:
select count(*) from ASSETS_MASTER m, PERSON p where m.asset_user = '' || p.person_id
但它将阻止使用p.person\u id索引
在这种情况下,您必须创建to_char(person_id)的函数索引
直接回答您的问题-在您的查询中,Oracle隐式调用varchar m.asset_用户的_number。它可以正常工作,直到m.asset_用户被分配到类似“12345”或null甚至“”。。。但一旦遇到类似“123”的内容,它就会返回无效数字。您可以尝试以下方法:
select count(*) from ASSETS_MASTER m, PERSON p where m.asset_user = '' || p.person_id
但它将阻止使用p.person\u id索引
在这种情况下,您必须创建to_char(person_id)的函数索引
直接回答您的问题-在您的查询中,Oracle隐式调用varchar m.asset_用户的_number。它可以正常工作,直到m.asset_用户被分配到类似“12345”或null甚至“”。。。但一旦遇到类似“123”的内容,它就会返回无效数字。如果不查看您的数据,我们就无法判断。您是否试图将字符串(
m.asset\u user
)与数字(p.person\u id
)或类似性质的东西进行比较?即使m.asset\u user
是字符串,p.person\u id
是数字,Oracle不会进行隐式类型转换,或者至少返回笛卡尔积,因为该条件从未满足?@SandPiper-不,也不是。如果您尝试将字符串与数字进行比较,Oracle将尝试将字符串转换为数字,而不是相反的方式(不要问我为什么!-我宁愿Oracle抛出错误,也不要在背后进行任何尝试)。如果字符串不能被转换,你就会得到这个错误。然后:它将返回空集;如果条件始终为真,则为笛卡尔积。但这个条件(与VARCHAR2相比,数字)永远不会为真,也永远不会为假;相反,它在语法上是不正确的,Oracle应该拒绝它的数据类型mismatch@SandPiper所以asset\u user是varchar,person\u id是number,但如果我删除count(*)并将其更改为id(例如),则查询将正常运行,更好的问题是,为什么要尝试在不可能正确的条件下加入?ASSET\u USER实际上应该是一个数字(以匹配另一个表中的PERSON\u ID)?如果是这样的话,那么应该首先固定表格;您永远不必在一对甚至不是相同数据类型的列上联接表。如果不查看您的数据,我们无法判断。您是否试图将字符串(m.asset\u user
)与数字(p.person\u id
)或类似性质的东西进行比较?即使m.asset\u user
是字符串,p.person\u id
是数字,Oracle不会进行隐式类型转换,或者至少返回笛卡尔积,因为该条件从未满足?@SandPiper-不,也不是。如果您尝试将字符串与数字进行比较,Oracle将尝试将字符串转换为数字,而不是相反的方式(不要问我为什么!-我宁愿Oracle抛出错误,也不要在背后进行任何尝试)。如果字符串不能被转换,你就会得到这个错误。然后:它将返回空集;如果条件始终为真,则为笛卡尔积。但这个条件(与VARCHAR2相比,数字)永远不会为真,也永远不会为假;相反,它在语法上是不正确的,Oracle应该拒绝它的数据类型mismatch@SandPiper所以asset\u user是varchar,person\u id是number,但如果我删除count(*)并将其更改为id(例如),则查询将正常运行,更好的问题是,为什么要尝试在不可能正确的条件下加入?ASSET\u USER实际上应该是一个数字(以匹配另一个表中的PERSON\u ID)?如果是这样的话,那么应该首先固定表格;您永远不必在一对甚至不是相同数据类型的列上联接表。