Ich möchte eine Division in einer SELECT-Klausel durchführen. Wenn ich einige Tabellen verbinde und die Aggregatfunktion verwende, habe ich oft entweder Null- oder Nullwerte als Teiler. Im Moment habe ich nur diese Methode entwickelt, um die Division durch Null- und Nullwerte zu vermeiden.
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
Ich frage mich, ob es einen besseren Weg gibt, dies zu tun.
sql
postgresql
null
aggregate-functions
divide-by-zero
William Wino
quelle
quelle
Antworten:
Da
count()
nie zurückgegeben wirdNULL
(im Gegensatz zu anderen Aggregatfunktionen), müssen Sie nur den0
Fall erfassen (was ohnehin der einzige problematische Fall ist):CASE count(column_name) WHEN 0 THEN 1 ELSE count(column_name) END
Zitieren des Handbuchs zu Aggregatfunktionen:
quelle
Sie können die NULLIF- Funktion verwenden, z
Wenn der Wert von
column_name
0 ist, ist das Ergebnis des gesamten Ausdrucks NULLquelle
Mir ist klar, dass dies eine alte Frage ist, aber eine andere Lösung wäre, die größte Funktion zu nutzen:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
Hinweis: Ich würde es vorziehen, entweder eine NULL zurückzugeben, wie in der Antwort von Erwin und Yuriy, oder dies logisch zu lösen, indem der Wert
0
vor der Divisionsoperation erkannt und zurückgegeben wird0
. Andernfalls können die Daten durch die Verwendung falsch dargestellt werden1
.quelle
Eine andere Lösung, die die Division durch Null vermeidet und durch 1 ersetzt
select column + (column = 0)::integer;
quelle
Wenn Sie möchten, dass der Teiler 1 ist, wenn die Anzahl Null ist:
Die Besetzung von
true
bisinteger
ist 1.quelle
CASE
ist auch schneller, auch wenn ausführlicher.