2011-04-28 76 views

回答

7

這是一個有效的行爲:聚合函數通常返回應用於空集的NULL,而COUNT(*)返回0

如果你不想行如果表是空的,用這個:

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

可能查詢返回一個空值的行。這是MAX的指定行爲。這個link提供了一個關於如何在SQL中處理NULL值的體面概述。

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結果的行。這取決於業務要求,哪個結果是正確的。

+3

由於'ts'中的實際'NULL'值,'MAX(ts)'也可以是'NULL'。 – Quassnoi 2011-04-28 13:49:05

1

如果你想獲得NULL嘗試的乘坐:具有計數從#dd

CREATE TABLE my_date (
    the_date DATE 
); 

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

乾杯,

+0

正如Quassnoi指出的那樣,如果表中有行但THE_DATE的所有實例均爲NULL,則將返回一個空集。這可能不是理想的結果。 – APC 2011-04-28 15:55:49

0

選擇@maxPK = MAX(ID)(ID)> 0

這將工作。