it-swarm.com.de

Postgresql Gibt 0 zurück, wenn Null

Ich versuche, eine Abfrage mit MAX() auszuführen, aber mein Problem ist, dass die Daten nichts zurückgeben, wenn das Feld einen NULL -Wert enthält. Das Aktualisieren der Tabelle ist keine Option. Wie sollte diese Abfrage neu geschrieben werden, um 0 zurückzugeben, wenn NULL?

Beispiel-DDL unten - und ich habe eine WHERE -Klausel fest codiert, die nur zur Veranschaulichung nichts zurückgibt. Idealerweise möchte ich alle usernames und die höchste logincount für den Benutzer zurückgeben

CREATE TABLE Test 
(
 username varchar(50) not null,
 logincount int,
 logindate Date
);

Insert Into Test (username, logincount, logindate) 
VALUES
('er11', 1, '2017-01-01'), ('er11', 2, '2017-01-02'), ('ff12', NULL, NULL)
,('jb88', 1, '2017-01-09');

With maxlogincount As
(
    select max(logincount) As "MaxLoginCount"
    ,username
    FROM Test
    GROUP BY username
)
Select
username
,logincount
,logindate
FROM Test t
inner join maxlogincount mlc
ON t.username = mlc.username
And mlc."MaxLoginCount" = t.logincount
WHERE t.username = 'ff12'
Order by t.username asc
7
Michael Mormon

Verwenden Sie max(coalesce(logincount, 0)), um NULL-Werte zu vermeiden

Laut Postgres docs (9.6) :

Die COALESCE-Funktion gibt das erste ihrer Argumente zurück, das nicht null ist. Null wird nur zurückgegeben, wenn alle Argumente null sind. Es wird häufig verwendet, um Nullwerte durch einen Standardwert zu ersetzen, wenn Daten zur Anzeige abgerufen werden. Beispiel:

14
McNets

Vielleicht habe ich hier etwas Offensichtliches verpasst, aber wäre die Funktion NULLIF nicht eine viel bessere (und elegantere) Lösung?

Postgres Dokumentation hier .

SELECT
  COUNT(NULLIF(logincount,0)) AS "Max Login Count",
  username,
FROM Test
GROUP BY username
ORDER BY "Max Login Count";

Ergebnis:

'Max Login Count'   username
----------------------------
               0        ff12
               1        jb88
               2        er11
0
Vérace