我在AS400系统上的DB2数据库上。我有一个选择的查询,它在标题中抛出错误:SQL0802代码6,该代码6是"无效的数字数据"(翻译(。
我尝试将查询分开以不同的部分分开,然后一个一个一个一个一个一个一个一个,一个人来查看它是否有效,我99%的人确信问题是由于我在子查询中使用的" cast"条款而出现的(铸造char to 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本身正常工作。
*运行query1没有" homing"子句也可以正常工作。
*如果我将query2中的" select cast ..."子查询替换为"(2002,9912,1234(",然后运行主要查询,它可以正常工作,所以这几乎证实了问题是问题所在" cast"条款。
*我必须将itmnumbr施放到int,因为itemnumber是数字类型和itmnumbr是char类型。
你说:
*我必须将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(创建表...(创建表,则该表不能包含不良数据。数据类型将在写入上验证,无论您如何编写数据,都将在写入表格之前进行验证。如果表由DDS(CRTPF ...(创建,则表确实可以包含不良数据,因为数据在读取并加载到变量中之前未验证数据。通过从程序中描述的数据结构中编写记录来将数据写入DDS表的旧样式程序能够将他们想要的任何内容都放入DDS定义的表中,包括字符字段中的数字数据或更糟的是数字字段中的字符数据。通常仅在从系统/36(大约1980年代(迁移的非常旧的数据库中找到,该数据库使用了平面文件而不是数据库文件(它没有数据库的概念(。我只认为这是可能的。使用hex()
检查文件中的数据,以查看ItmNumbr
或ItemNumber
字段中是否有任何时髦。
我不确定,但是我认为问题与您的" where j = x"的加入有关,因为我们不知道" j"是什么,并且可能不会加入到" X"(不是正确的数据类型(。
基于您的分析:
"*如果我将query2中的" select cast ..."子查询替换为"(2002,9912,1234(",然后运行主要查询,它可以正常工作,所以这几乎证实了问题的问题" cast"子句。
检查表3的内容。如果将其定义为数字(未包装小数(,则可能包含非数字值(通常是空格(。这可能导致您观察到的错误。