我正在我的表中有一個日期列之一運行以下查詢。選擇一個MAX日期列不工作與空表
select max(date) from mydate
問題是,當表爲空時,它也返回一行。我正在使用Oracle 11。
有什麼建議嗎?
我正在我的表中有一個日期列之一運行以下查詢。選擇一個MAX日期列不工作與空表
select max(date) from mydate
問題是,當表爲空時,它也返回一行。我正在使用Oracle 11。
有什麼建議嗎?
這是一個有效的行爲:聚合函數通常返回應用於空集的NULL
,而COUNT(*)
返回0
。
如果你不想行如果表是空的,用這個:
SELECT MAX(date)
FROM mydate
HAVING COUNT(*) > 0
可能查詢返回一個空值的行。這是MAX的指定行爲。這個link提供了一個關於如何在SQL中處理NULL值的體面概述。
其實這是工作。它只是不按照你認爲應該的方式工作。總是返回結果是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結果的行。這取決於業務要求,哪個結果是正確的。
如果你想獲得NULL
嘗試的乘坐:具有計數從#dd
CREATE TABLE my_date (
the_date DATE
);
SELECT MAX(the_date) FROM my_date HAVING MAX(the_date) IS NOT NULL;
乾杯,
正如Quassnoi指出的那樣,如果表中有行但THE_DATE的所有實例均爲NULL,則將返回一個空集。這可能不是理想的結果。 – APC 2011-04-28 15:55:49
選擇@maxPK = MAX(ID)(ID)> 0
這將工作。
由於'ts'中的實際'NULL'值,'MAX(ts)'也可以是'NULL'。 – Quassnoi 2011-04-28 13:49:05