0

如何在查询中不使用“is null”来查找日期列为空的行?

SELECT * FROM HR_OPERATING_UNITS WHERE date_to IS NULL;

在上面的查询中,我想使用一个可以包含 null 的绑定变量。因此,预期的查询是:

SELECT * FROM HR_OPERATING_UNITS WHERE date_to=:P_TO_DATE;

但是上面的语句没有获取任何行,尽管该绑定变量中有空值。

4

4 回答 4

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列中的值作为虚拟值。

于 2013-07-05T12:43:53.553 回答
1

如果我理解您的问题,您想在任何时候过滤或绑定变量为空,或者不是。如果是这样,请尝试以下操作:

 SELECT * FROM HR_OPERATING_UNITS WHERE (:P_TO_DATE IS NULL AND date_to IS NULL) OR (date_to=:P_TO_DATE);
于 2013-07-05T12:45:03.273 回答
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,则默认日期比较为真。如果两者都不是NULL,则比较是该值的列。如果是'NULL',则比较的是默认值,即 false。

于 2013-07-05T12:48:57.117 回答
0

如果值为空,则使用日期最小值:

ISNULL(date_to,cast('1753-1-1' as datetime)) = ISNULL(:P_TO_DATE,cast('1753-1-1' as datetime)) 

这是用于 sql server,可能需要用 NVL 替换 ISNULL

于 2013-07-05T12:44:22.537 回答