SQL0802-无效的数字数据

时间:2019-05-03 22:35:10

标签: sql db2 ibm-midrange

我在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类型。

3 个答案:

答案 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()检查文件中的数据,以查看ItmNumbrItemNumber字段中是否有任何时髦内容。

答案 1 :(得分:0)

我不确定,但我认为问题与您加入“ WHERE J = X”有关,因为我们不知道“ J”是什么,并且可能不会加入“ X”(不正确)数据类型)。

答案 2 :(得分:0)

根据您的分析:

“ **如果我用诸如”(2002,9912,1234)“之类的东西替换query2中的” SELECT CAST ...“子查询,然后运行主查询,它就可以正常工作,因此,这足以确认问题是“ CAST”子句。”

检查TABLE3.ItmNumbr的内容。如果将其定义为NUMERIC(无包装十进制),则可能包含非数字值(通常为空格)。这可能是导致您正在观察的错误。