Ich möchte eine Division in einer SELECT-Klausel durchführen. Wenn ich einige Tabellen verbinde und Aggregatfunktionen verwende, habe ich oft Null- oder Nullwerte als Trenner. Im Moment finde ich nur diese Methode, 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?
Da count()
NIEMALS NULL
zurückgibt (im Gegensatz zu anderen Aggregatfunktionen), müssen Sie nur den 0
-Fall abfangen (der ohnehin der einzige Problemfall ist):
CASE count(column_name)
WHEN 0 THEN 1
ELSE count(column_name)
END
Zitat des Handbuchs zu Aggregatfunktionen:
Es sei darauf hingewiesen, dass diese Funktionen mit Ausnahme von
count
eine .__ zurückgeben. Nullwert, wenn keine Zeilen ausgewählt sind.
Sie können die NULLIF-Funktion verwenden, z.
something/NULLIF(column_name,0)
Wenn der Wert von column_name
0 ist, ist das Ergebnis des gesamten Ausdrucks NULL
Ich weiß, dass dies eine alte Frage ist, aber eine andere Lösung wäre die Verwendung der greatest - Funktion:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
Anmerkung: Meine Präferenz wäre, entweder einen NULL-Wert zurückzugeben, wie in Erwin und Yuriys Antwort, oder diese logisch zu lösen, indem der Wert 0
vor der Division ermittelt und 0
zurückgegeben wird. Andernfalls können die Daten durch die Verwendung von 1
falsch dargestellt werden.
Eine andere Lösung, die nur die Division durch Null vermeidet und die Division durch 1 ändert
select column + (column = 0)::integer;
Wenn Sie möchten, dass der Teiler 1 ist, wenn die Anzahl Null ist:
count(column_name) + 1 * (count(column_name) = 0)::integer
Die Besetzung von true
in integer
lautet 1.