如何在查询中不使用“is null”来查找日期列为空的行?
SELECT * FROM HR_OPERATING_UNITS WHERE date_to IS NULL;
在上面的查询中,我想使用一个可以包含 null 的绑定变量。因此,预期的查询是:
SELECT * FROM HR_OPERATING_UNITS WHERE date_to=:P_TO_DATE;
但是上面的语句没有获取任何行,尽管该绑定变量中有空值。
如何在查询中不使用“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 的变量:
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
列中的值作为虚拟值。
如果我理解您的问题,您想在任何时候过滤或绑定变量为空,或者不是。如果是这样,请尝试以下操作:
SELECT * FROM HR_OPERATING_UNITS WHERE (:P_TO_DATE IS NULL AND date_to IS NULL) OR (date_to=:P_TO_DATE);
您可以使用以下方法执行此操作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。
如果值为空,则使用日期最小值:
ISNULL(date_to,cast('1753-1-1' as datetime)) = ISNULL(:P_TO_DATE,cast('1753-1-1' as datetime))
这是用于 sql server,可能需要用 NVL 替换 ISNULL