如何从 Db2 中的十进制字段中获取无效值列表?

Posted

技术标签:

【中文标题】如何从 Db2 中的十进制字段中获取无效值列表?【英文标题】:How do you get a list of invalid values from a decimal field in Db2? 【发布时间】:2020-05-29 15:15:04 【问题描述】:

我对在非空十进制字段中具有空值的列有疑问。使用该列时会出现问题(例如在 case 语句中),但不是在我简单地执行 select * from 时。

它出现的错误是 SQL0802 类型 6 - 无效的数字数据。我能够找到其中一些并修复它,但我想从这个非常大的表中获取所有这些的列表。

但同样,每当我使用它时,它都会给我错误。这是我一直在尝试的主要内容:

SELECT *
FROM (
    SELECT keycol_1, keycol_2,
        IFNULL(badcol, -1) AS badcol_tmp
    FROM mytable
) WHERE badcol_tmp = -1

(请注意,该列不应包含负数,这就是我在那里使用 -1 的原因)。这给出了上面列出的错误。

我也试过

SELECT *
FROM mytable
WHERE badcol IS NULL

这没有给我任何结果...没有错误,但没有行。但是我已经看到它在滚动所有数据时是空的。

如何获取 badcol 中的空值列表?

【问题讨论】:

@mao 它是 DDS,而不是 DDL。它是 2S 0。它不能为空,因为它实际上是密钥的一部分。您能否详细说明“但是您如何确定运行的查询?”我所做的只是“SELECT * FROM mytable”并滚动了很多,直到找到一个空值。平台是 i 系列。我不知道版本/补丁包,也不知道如何找到它(我不是系统管理员) @TheLittlePeace:请向我们展示引发您遇到的错误的片段或代码。 @GMB 根据公司政策,我不允许提供更多详细信息,例如实际列名或实时代码。但是我问题中的第一个代码位会引发错误。最后,问题不在于错误,我想知道如何查看所有不应该出现空值的行,因此我可以通过使它们有效来修复错误。 您如何确定它是 NULL,您的意思是空格或其他字符,或者对于这些值在您的显示器上看不到任何字符? 以十六进制模式查看它也可以确定差异。 【参考方案1】:

问题不在于值为null,如果是这样的话,那么

SELECT *
FROM mytable
WHERE badcol IS NULL

会起作用的。问题是字段中的数据不是数字。

如果您使系统保持最新状态,那么恭喜! IBM 在 7.3 和 7.4 的最新 TR 中添加了一些 validation utilities。

否则请尝试以下方法(对于 2 位分区号码):

select *
from mytable
where substr(hex(badcol),1,1) not in ('F','D')
      or substr(hex(badcol),2,1) not between '0' and '9' 
      or substr(hex(badcol),3,1) not in ('F','D')
      or substr(hex(badcol),4,1) not between '0' and '9' 

【讨论】:

谢谢,我会在这个星期一回到办公室时试试。作为旁注,我是否应该更改帖子,因为它实际上不是空值,尽管表面上看起来像一个空值? @TheLittlePeace - 是否在这种情况下编辑问题(在这种情况下学习更多会发现最初措辞的问题在某种意义上是“错误的”)是一件棘手的事情。您不想突然做出一个或多个答案与问题“不匹配”,因为这会使事情变得更加混乱,并且对这篇文章的未来读者没有帮助。我已经将主题行推向了正确的方向;但在我看来,最好保持正文原样。 我必须和我们的系统管理员谈谈,因为我们的系统显然不是最新的 :) 您提供的查询确实有效。谢谢!

以上是关于如何从 Db2 中的十进制字段中获取无效值列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java从firebase数据库中的列表中获取所有值?

怎么获取DataTable中某一字段的值

从 DB2 中的表中获取值

如何从表中获取字段列表和不同值

如何从 db2 中的选定日期获取接下来 24 小时的所有数据?

DB2:需要获取给定db2表的列列表和不同的值计数