选择日期IN(NULL,> = SYSDATE)

时间:2013-02-05 13:45:59

标签: sql oracle10g

这可能吗?可以吗

SELECT * FROM DATES_TBL WHERE DATES_TBL.DATES IN(NULL, >=SYSDATE)

?也许我格式错误,或者错过了勾号?

我希望select是日期字段中NULL或大于今天日期(>=SYSDATE)的值。任何帮助将不胜感激。

SQL 10g

4 个答案:

答案 0 :(得分:3)

SELECT * 
FROM DATES_TBL
WHERE DATES IS NULL OR DATES >= SYSDATE

答案 1 :(得分:1)

NULL值是一个特殊值,因此您必须编写如下语句:

SELECT *
FROM   DATES_TBL
WHERE  DATES IS NULL
OR     DATES >= SYSDATE

答案 2 :(得分:1)

这绝对不是一种有效的语法:IN查询需要特定的项目;另外,因为在SQL中null永远不等于任何东西,包括其他空值,所以将空值放入IN列表是没有意义的。

您需要的是OR

SELECT * WHERE (DATES_TBL.DATES IS NULL) OR (DATES_TBL.DATES>=SYSDATE)
--              ^^^^^^^^^^^^^^^^^^^^^^^      ^^^^^^^^^^^^^^^^^^^^^^^^
--                |                             |
--                |                             +- This is how you compare for >=
--                +------------- This is how you check for NULL
  

每次我尝试使用OR子句都会导致大量的运行时间

如果引入OR来合并非重叠结果(在这种情况下是正确的,因为列是null或大于SYSDATE,而不是两者都是)您可以使用UNION ALL来加速搜索:

SELECT * WHERE DATES_TBL.DATES IS NULL
UNION ALL
SELECT * WHERE DATES_TBL.DATES >= SYSDATE

您需要确保DATES_TBL.DATES列已编入索引。

答案 3 :(得分:0)

假设这是针对Oracle的,请尝试以下方法:

SELECT * FROM DATES_TBL WHERE(DATES_TBL.DATES为null或DATES_TBL.DATES> = sysdate)

括号使其有效。