2 Stimmen

Postgresql ersetzen 0 durch "NULL"

Ich möchte Werte einer Zeile im Output mit nur leeren (NULL) Werten ersetzen. Ich arbeite mit einer Unterabfrage im SELECT, bin mir aber nicht ganz sicher, wie ich das machen soll. Bisher sieht meine Abfrage so aus:

select spelersnr, (select count(bedrag) from boetes where boetes.spelersnr = S.spelersnr
) as aantalboetes

from spelers S inner join wedstrijden using(spelersnr)
left join boetes using(spelersnr)
group by spelersnr

order by aantalboetes asc, spelersnr asc

Zusätzlich muss ich erst alle Werte, die nicht NULL sind, in aufsteigender Reihenfolge sortieren, und dann die NULL-Werte.

Vielen Dank!

6voto

David Aldridge Punkte 50293

Das Ersetzen eines Werts durch einen Nullwert ist einfach, indem die NullIf() -Funktion verwendet wird. Typischerweise wird sie verwendet, um einen Divisionsfehler durch Null zu vermeiden ...

numerator/NullIf(denominator,0)

... damit eine Division durch Null zu einem Nullwert führt.

In Ihrem Fall können Sie es auf die count(*) anwenden:

NullIf(count(*),0)

4voto

Gordon Linoff Punkte 1198148

Ich denke nicht, dass du die Unterabfrage brauchst. Das Folgende sollte dasselbe machen, weil du bereits die Tabelle boetes mit derselben Spalte für die Aggregation und die korrelierte Unterabfrage verbindest:

select spelersnr, count(bedrag) as aantalboetes
from spelers S inner join
     wedstrijden
     using(spelersnr) left join
      boetes using(spelersnr)
group by spelersnr
order by aantalboetes asc, spelersnr asc;

Mit dieser Abfrage kannst du einfach folgendes tun:

select spelersnr,
       (case when count(bedrag) > 0 then count(bedrag) end) as aantalboetes
from spelers S inner join
     wedstrijden
     using(spelersnr) left join
      boetes using(spelersnr)
group by spelersnr
order by aantalboetes asc, spelersnr asc;

Eigentlich könntest du das gleiche case auch in deiner Version verwenden:

select spelersnr,
       (select (case when count(bedrag) > 0 then count(bedrag) end)
        from boetes
        where boetes.spelersnr = S.spelersnr
       ) as aantalboetes

Aber die korrelierte Unterabfrage ist unnötig.

Für die Sortierung einfach:

order by count(*) desc

Du kannst nach einer Spalte sortieren, die nicht im select-Statement enthalten ist, und das ist die Logik, nach der du suchst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X