Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';我的oracle sql中没有计算工作_Sql_Oracle_Aggregate Functions - Fatal编程技术网

为什么';我的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)?如果是这样的话,那么应该首先固定表格;您永远不必在一对甚至不是相同数据类型的列上联接表。