选择MAX on Date列不使用空表

时间:2011-04-28 13:36:49

标签: sql oracle

我在我的一个有日期列的表上运行以下查询。

select max(date) from mydate

问题是,当表为空时,它也会返回一行。我正在使用Oracle 11。

有什么建议吗?

5 个答案:

答案 0 :(得分:7)

这是一种有效的行为:聚合函数通常返回一个NULL应用于空集,COUNT(*)返回0

如果表格为空,如果您不想要一行,请使用:

SELECT  MAX(date)
FROM    mydate
HAVING  COUNT(*) > 0

答案 1 :(得分:2)

实际上它正在发挥作用。它只是没有你想象的那样工作。始终返回结果为the documented behaviour for aggregating functions

SQL> select ts from t23;

TS
---------
25-APR-11
26-APR-11

SQL> select max(ts) from t23
  2  /

MAX(TS)
---------
26-APR-11

SQL> delete from t23
  2  /

2 rows deleted.

SQL> select max(ts) from t23
  2  /

MAX(TS)
---------


SQL>

但是,如果你真的想要一个空集并相应地处理它,你将不得不做这样的事情:

SQL> select max_ts from
  2      ( select max(ts) as max_ts from t23 )
  3  where max_ts is not null
  4  /

no rows selected

SQL>

嗯,Quassnoi的解决方案更整洁(打字更少):

SQL> select max(ts) from t23
  2  having count(*) > 0
  3  /

no rows selected

SQL>

正如Quassnoi指出的那样,即使表有行,我的解决方案也会返回一个空集,前提是没有填充列TS的实例。在相同的情况下,Q的解决方案将返回一个带有NULL结果的行。这取决于业务要求,哪个结果是正确的。

答案 2 :(得分:1)

如果你想摆脱NULL尝试:

CREATE TABLE my_date (
  the_date DATE
);

SELECT MAX(the_date) FROM my_date HAVING MAX(the_date) IS NOT NULL;

干杯,

答案 3 :(得分:0)

可能查询返回一行为空值。这是MAX的指定行为。这个link提供了一个关于如何在SQL中处理NULL值的合理概述。

答案 4 :(得分:0)

从#dd中选择@maxPK = max(id)来计数(id)> 0

这将有效。