it-swarm.com.de

Vermeiden Sie in PostgreSQL die Division durch Null

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?

40
William

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.

28

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

131
Yuriy Galanter

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.

21
vol7ron

Eine andere Lösung, die nur die Division durch Null vermeidet und die Division durch 1 ändert

select column + (column = 0)::integer;
1
Manvel

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.

1
Clodoaldo Neto