Aggregat ein leeres ResultSet
Ich würde, wie die Aggregate von einer leeren Ergebnismenge auf 0 sein. Ich habe versucht, die folgenden:
SELECT SUM(COALESCE(capacity, 0))
FROM objects
WHERE null IS NOT NULL;
Ergebnis:
sum
-----
(1 row)
Subquestion: wäre das nicht die oben genannten arbeiten in Oracle, mit SUM(NVL(capacity, 0))
?
- Welche Fehler haben Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom die Dokumentation Seite über Aggregatfunktionen:
So, wenn Sie gewährleisten wollen, ein Wert, der zurückgegeben wird, gelten
COALESCE
zu den Ergebnis vonSUM
, nicht mit den argument:Als für die Oracle 'subquestion', gut, ich konnte keine Vorstellung von Null-Werten auf der offiziellen doc-Seite (die eine für 10.2, im besonderen), sondern zwei anderen Quellen sind eindeutig:
Oracle-SQL-Funktionen:
Aggregatfunktion sum [Oracle SQL]:
Ist, brauchen Sie nicht zu gelten NVL zu
capacity
. (Aber, wie mitCOALESCE
im PostgreSQL, möchten Sie vielleicht, um es anwenden zuSUM
.)to substitute null for zero
statt zitiertto substitute zero for null
? Ich bin kein native speaker aber.Die Sache ist die, das Aggregat immer eine Zeile zurück, auch wenn keine Zeilen wurden aggregiert (wie es der Fall in der Abfrage). Sie fasste einen Ausdruck über keine Zeilen. Daher auch der null-Wert, den Sie hier bekommen.
Versuchen Sie dies:
sum(round(stuff))
im pg8. 🙂Nur dazu:
Durch die Art und Weise, VERSCHMELZEN im inneren der SUMME ist überflüssig, auch wenn die Kapazität NULL ist, ist es nicht die Inhaltsangabe null.
Nämlich:
Zurückgeben einen Wert von 6, nicht null.
Und ein verschmelzen innerhalb einer Aggregatfunktion ist ein performance-killer zu, wie Sie Ihre RDBMS-engine kann nicht nur Abzocke durch alle Zeilen ausgewertet werden muss, um jede Zeile der Spalte, wenn der Wert null ist. Ich habe gesehen, ein bisschen OCD-Abfrage, wo alle Aggregat-Abfragen ist ein verschmelzen von innen, ich denke, die original-dev hat ein symptom von Cargo Cult Programming, die Abfrage ist Weg, sehr sloooowww. Ich entfernte die coalesce-innerhalb der SUMME, dann wird die Abfrage dadurch schneller.
Obwohl dieser Beitrag schon sehr alt ist, aber ich möchte zu aktualisieren, was ich in solchen Fällen
Hier externe NVL vermeidet den Fällen, wenn es keine Zeile in der Ergebnismenge. Innere NVL wird verwendet für die Spalte null-Werte, betrachten wir den Fall (1 + null) und es wird im Ergebnis null. Also innere NVL ist auch notwendig, andere weisen, die in alternativen default-Wert 0 der Spalte.