如何查找日期列为空的行而不在查询中使用“is null”
SELECT * FROM HR_OPERATING_UNITS WHERE date_to IS NULL;
在上面的查询中,我想使用一个可以在其中包含null的绑定变量。 所以,期望的查询是:
SELECT * FROM HR_OPERATING_UNITS WHERE date_to=:P_TO_DATE;
但是上面的语句没有获取任何行,尽管该绑定变量中存在null。
答案 0 :(得分:3)
标准方法是分别处理变量null:
SELECT * FROM HR_OPERATING_UNITS
WHERE date_to=:P_TO_DATE
OR (:P_TO_DATE IS NULL AND date_to IS NULL)
如果你真的必须只有一个对变量的引用:
SELECT * FROM HR_OPERATING_UNITS
WHERE COALESCE(date_to, '1900-01-01') = COALESCE(:P_TO_DATE, '1900-01-01')
选取永远不会出现在date_to
列中的值作为虚拟值。
答案 1 :(得分:1)
如果我理解你的问题你想要过滤,或者绑定变量是否为null。如果是这样,请尝试以下操作:
SELECT * FROM HR_OPERATING_UNITS WHERE (:P_TO_DATE IS NULL AND date_to IS NULL) OR (date_to=:P_TO_DATE);
答案 2 :(得分:1)
您可以使用coalesce()
:
SELECT *
FROM HR_OPERATING_UNITS
WHERE coalesce(date_to, '2000-01-01') = coalesce(:P_TO_DATE, '2000-01-01')
这假设'2000-01-01'
不是date_to
中的有效日期值。
如果两个值均为NULL
,则默认日期比较为true。如果两者都不是NULL
,则比较是值的列。如果一个是'NULL'
,那么比较是默认值,即false。
答案 3 :(得分:0)
如果值为null,则使用date min value:
ISNULL(date_to,cast('1753-1-1' as datetime)) = ISNULL(:P_TO_DATE,cast('1753-1-1' as datetime))
这适用于sql server,可能必须用NVL替换ISNULL