我在as400系统上的db2数据库上。 我有一个选择查询,该查询的标题中引发错误:SQL0802代码6,它是“无效的数字数据”(已翻译)。
我尝试将查询分成不同的部分,并逐个测试每个部分是否有效,我99%的人认为问题是由于我在子查询中使用了“ CAST”子句( CHAR到INT),我只是不明白为什么子查询本身可以工作,但不能作为主查询的一部分。
因此,如果我使用“ CAST”子句运行子查询,则可以正常工作,但是当我运行使用子查询的主查询时,它将无法正常工作,并且会出现错误。 主要查询可以分为2个查询,请参见下面的代码。
query1看起来像这样:
select SUM(Price) from TABLE1
where X = 1
group by Country
having SUM(Price) = (query2);
query2看起来像这样:
SELECT SUM(UnitPrice * AmountStocked)
FROM TABLE2
WHERE J = X and ItemNumber in (
SELECT CAST(ItmNumbr AS INT) from TABLE3
where Id in (select Id from TABLE4 where Z=Y)
)
注意:
* query2将返回一个数字。
*单独运行query2可以正常工作。
*运行没有“ having”子句的query1也可以正常工作。
*如果我将query2中的“ SELECT CAST ...”子查询替换为“(2002,9912,1234)”之类的东西,然后运行主查询,它就可以正常工作,因此,这足以确认问题是“ CAST”子句。
*我必须将ItmNumbr转换为INT,因为ItemNumber是数字类型,并且 ItmNumbr是Char类型。
答案 0 :(得分:1)
您说:
*我必须将ItmNumbr转换为INT,因为ItemNumber是数字类型,而ItmNumbr是Char类型。
但这不是事实。您可以采用另一种方法:
SELECT SUM(UnitPrice * AmountStocked)
FROM TABLE2
WHERE J = X and CHAR(ItemNumber) in (
SELECT TRIM(ItmNumbr) from TABLE3
where Id in (select Id from TABLE4 where Z=Y)
)
这里的优点是ItmNumber
中的非数字字符不会让您大惊小怪,CHAR(ItemNumber)
也应该不会失败。
要了解DB2 for i
的一件事是创建数据库表的方法有两种,而两种方法在结果表的特性上略有不同。如果使用DDL(CREATE TABLE ...)创建表,则该表不能包含错误数据。数据类型在写入时进行验证,无论您如何写入数据,都将在写入表之前对其进行验证。如果该表是由DDS(CRTPF ...)创建的,则该表的确可能包含错误的数据,因为直到将其读取并加载到变量中之后,数据才被验证。通过从程序描述的数据结构写入记录将数据写入DDS表的旧式程序能够将所需的内容放入DDS定义的表中,包括字符字段中的数字数据或更糟的是数字字段中的字符数据。通常只能在从System / 36(大约在1980年代)迁移的非常旧的数据库中找到该文件,该数据库使用平面文件而不是数据库文件(它没有数据库的概念)。我只认为这是可能的。使用hex()
检查文件中的数据,以查看ItmNumbr
或ItemNumber
字段中是否有任何时髦内容。
答案 1 :(得分:0)
我不确定,但我认为问题与您加入“ WHERE J = X”有关,因为我们不知道“ J”是什么,并且可能不会加入“ X”(不正确)数据类型)。
答案 2 :(得分:0)
根据您的分析:
“ **如果我用诸如”(2002,9912,1234)“之类的东西替换query2中的” SELECT CAST ...“子查询,然后运行主查询,它就可以正常工作,因此,这足以确认问题是“ CAST”子句。”
检查TABLE3.ItmNumbr的内容。如果将其定义为NUMERIC(无包装十进制),则可能包含非数字值(通常为空格)。这可能是导致您正在观察的错误。