不使用'isnull'并查找在特定列中具有null的行

时间:2013-07-05 12:39:52

标签: sql

如何查找日期列为空的行而不在查询中使用“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。

4 个答案:

答案 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