空值是否大于任何日期数据类型?

24

我在DB2中有这个查询

SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A

如果SYSDATENULL,那么假设@ASOMESCHEMA.SOMETABLE.SYSDATE都是Date数据类型的值,SYSDATE是否大于@A中的任何值?请帮忙解答,谢谢。

3
据我所知,如果DB2具有“ANSI NULL”语义,则仅真正的二元运算符应该是“IS NULL”。 - user166390
1
@pst DB2 具有 ANSI,你所说的“唯一的二元运算符应该是“IS NULL””,是什么意思? - John Isaiah Carmona
1
"isnull" 是一个一元运算符,用于检查表达式是否为 NULL。 - nomen
3个回答

19
另一个对比可能包含NULL值的有用谓词是DISTINCT谓词。使用正常等于比较(COL1 = COL2)比较两列将为真,如果两个列都包含相等的非空值。如果两个列都为空,则结果将为假,因为null从不等于任何其他值,甚至不等于另一个null值。使用DISTINCT谓词,将认为null值相等。因此,如果两个列包含相等的非空值或都是null值,则COL1和COL2是NOT DISTINCT的将为真。

DB2 Null Handling

这意味着所有比较操作都将为假,因为您正在将未知值与其他值进行比较。因此,无论使用哪种比较(仅IS NULL / IS NOT NULL操作有效!),它都将为假。

如果您希望查询起作用,应该使用类似以下的内容:

SELECT * 
  FROM SOMESCHEMA.SOMETABLE 
 WHERE COALESCE(SYSDATE, TIMESTAMP_FORMAT('0001-01-01 23:59:59', 'YYYY-MM-DD HH24:MI:SS'))  > @A

1
谢谢回答,但是对我来说有些模糊。上面写着:null 永远不等于任何其他值,那么 equalgreater than 条件是一样的吗?请帮忙。 - John Isaiah Carmona
1
非常感谢您的帮助,但是当您说“失败”时,您的意思是查询将会出现错误吗? - John Isaiah Carmona
1
它将不会返回任何结果。比较被判定为假(这就是我所说的失败)。 - Eggi
1
第二,你自己指出了另一个与 null 进行比较可能会评估为 TRUE 的例子,例如 IS DISTINCT FROM。第三,在涉及到 null 的 greater than 比较中,评估结果为 UNKNOWN,例如 SYSDATE > NULL 的结果为 UNKNOWN。粗略地说,在 SQL DML 中,这将导致行从结果中删除,但在 SQL DDL 中将导致约束得到满足并且更新成功。处理 Null 是非直观和容易出错的:我强烈建议您完全避免使用 null。 - onedaywhen
我并没有说null是一个值?我已经说过它是未知的,但我的意思是比较是不正确的(所以将null与某些东西进行比较是错误的)。所以我在那里看不到错误。 - Eggi
显示剩余2条评论

15

另一种可能性是使用 IS NULL 来测试一个值是否为空:

  SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A OR SYSDATE IS NULL

相较于 COALESCE 函数,它会将该值包含在返回值集合中。不过,它只适用于简单情况。


1

您可以使用此解决方案来比较两个可空日期 (P.EndDate,C.EndDate):

[MinDate] =
        CASE
            WHEN
                ISNULL(C.EndDate,P.EndDate) <= ISNULL(P.EndDate,C.EndDate) 
            THEN
                ISNULL(C.EndDate,P.EndDate)
            ELSE
                ISNULL(P.EndDate,C.EndDate)
        END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接