SQL0802-无效的数字数据



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

我不确定,但是我认为问题与您的" where j = x"的加入有关,因为我们不知道" j"是什么,并且可能不会加入到" X"(不是正确的数据类型(。

基于您的分析:

"*如果我将query2中的" select cast ..."子查询替换为"(2002,9912,1234(",然后运行主要查询,它可以正常工作,所以这几乎证实了问题的问题" cast"子句。

检查表3的内容。如果将其定义为数字(未包装小数(,则可能包含非数字值(通常是空格(。这可能导致您观察到的错误。

相关内容

  • 没有找到相关文章

最新更新