我在我的一个有日期列的表上运行以下查询。
select max(date) from mydate
问题是,当表为空时,它也会返回一行。我正在使用Oracle 11。
有什么建议吗?
答案 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
这将有效。