Frage SQLite: Warum gibt 'min (time) from asdftable' eine leere Zeile zurück, wenn die DB leer ist?


Das ist eine Kuriosität. Ich habe eine leere SQLite DB.

Wenn ich ausführe select min(time) from asdftable Ich bekomme eine leere Reihe zurück. Wenn ich ausführe select time from asdftable Ich bekomme nichts zurück (was richtig ist).

Irgendwelche Ideen, warum das ist?


7
2017-10-30 15:08


Ursprung


Antworten:


Aggregatfunktionen geben alles zurück, auch wenn nichts gefunden wird, einfach weil sie implizit alle (beliebigen) Zeilen in Ihrer Tabelle gruppieren, um einen Gesamtwert zu erhalten. Nehmen count beispielsweise:

sqlite> create table foo (a int not null);
sqlite> select count(a) from foo;
0

null ist zu min wie 0 ist zu count wo keine Zeilen zurückgegeben werden.

Dies kann eine nützliche Eigenschaft sein. Betrachten Sie das folgende Beispiel:

sqlite> select ifnull(min(a), "I'm null") from foo;
I'm null

Wenn Sie diesen Fall filtern möchten, sodass keine Datensätze zurückgegeben werden, können Sie eine having-Klausel verwenden (und die Gruppierung explizit machen):

sqlite> select min(a) as min_a from foo group by a having min_a not null;

7
2017-10-30 15:22