PostgreSQL-Fehler: division by zero
ERROR: division by zero
Eine Division (oder Modulo) in der Query traf einen Nenner von null. Anders als manche Datenbanken und die meisten Fließkomma-Umgebungen wirft PostgreSQL einen Fehler, statt NULL oder unendlich zurückzugeben — daher muss jede Division, deren Nenner null sein kann, sagen, was passieren soll.
Was dieser Fehler bedeutet
Der Fehler bricht die gesamte Anweisung (und die Transaktion) ab, selbst wenn nur eine Zeile von Millionen die Null hatte. Deshalb taucht er typischerweise in Aggregationen und Reports auf: alles funktioniert bis zum ersten Tag, an dem eine Gruppe leer oder eine Summe null ist. Der Fix ist fast immer dasselbe Idiom, an der Divisionsstelle angewandt.
Häufige Ursachen
- Raten und Prozentsätze, bei denen der Nenner aus Daten kommt:
clicks / impressions,revenue / orders— in Ordnung, bis eine Null-Zeile auftaucht. - Prozentuale Veränderung gegen eine Null-Basislinie.
- Null aus einem Aggregat oder COALESCE:
count(*) FILTER (...)oderCOALESCE(x, 0), das einen Nenner speist.
So diagnostizieren Sie ihn
Finden Sie die Divisionen in der Query und fragen Sie, welcher Nenner null sein kann. Um die anstößigen Zeilen zu sehen, selektieren Sie den Nenner-Ausdruck mit seinen Gruppierungsschlüsseln und filtern Sie auf null — die zurückkommenden Zeilen sind diejenigen, die die Division sprengen werden.
So beheben Sie ihn
-- Das Standard-Idiom: Nenner null → Ergebnis NULL
SELECT clicks / NULLIF(impressions, 0) AS ctr FROM stats;
-- Wenn Sie 0 (oder einen anderen Default) statt NULL wollen:
SELECT COALESCE(clicks / NULLIF(impressions, 0), 0) AS ctr FROM stats;
NULLIF(x, 0)verwandelt die Null in NULL, und Division durch NULL ergibt NULL statt eines Fehlers. Entscheiden Sie bewusst, ob NULL ("undefiniert") oder ein Default für den Report richtig ist.- Benachbarte Falle, wo Sie gerade hier sind: Ganzzahldivision schneidet ab —
1/2 = 0. Casten Sie eine Seite (clicks::numeric / NULLIF(impressions, 0)), wenn Sie Brüche wollen.
