【问题标题】:How do you get a list of invalid values from a decimal field in Db2?如何从 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,您的意思是空格或其他字符,或者对于这些值在您的显示器上看不到任何字符?
  • 以十六进制模式查看它也可以确定差异。

标签: sql null db2 ibm-midrange db2-400


【解决方案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 - 是否在这种情况下编辑问题(在这种情况下学习更多会发现最初措辞的问题在某种意义上是“错误的”)是一件棘手的事情。您不想突然做出一个或多个答案与问题“不匹配”,因为这会使事情变得更加混乱,并且对这篇文章的未来读者没有帮助。我已经将主题行推向了正确的方向;但在我看来,最好保持正文原样。
  • 我必须和我们的系统管理员谈谈,因为我们的系统显然不是最新的 :) 您提供的查询确实有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2017-05-05
  • 2016-06-13
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多