我在DB2
中有此查询SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A
如果SYSDATE
为NULL
,则假设@A
和@A
是日期,它会大于SOMESCHEMA.SOMETABLE.SYSDATE
的任何值吗? 数据类型?
请帮忙。提前谢谢。
答案 0 :(得分:11)
另一个用于比较可以包含NULL值的值的谓词是DISTINCT谓词。如果两列包含相等的非空值,则使用正常的相等比较(COL1 = COL2)比较两列将为真。如果两个列都为null,则结果将为false,因为null永远不会等于任何其他值,甚至不是另一个null值。使用DISTINCT谓词,空值被认为是相等的。因此,如果两列都包含相等的非空值,并且两列都是空值,则COL1中的COL1不是DISTINCT将为真。
这意味着所有比较操作都将为false,因为您正在将未知值与某些内容进行比较。所以无论你使用哪种比较(只有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 :(得分:7)
另一种可能性是使用IS NULL
来测试值是否为null:
SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A OR SYSDATE IS NULL
将包含您返回值集合中的值,而不是COALESCE
函数。它只适用于简单的情况。
答案 2 :(得分: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