web-dev-qa-db-fra.com

Postgresql renverra 0 lorsque Null

J'essaie d'exécuter une requête à l'aide de MAX() mais mon problème est que si le champ contient une valeur NULL, les données ne renvoient rien. La mise à jour de la table n'est pas une option, alors comment cette requête doit-elle être réécrite pour retourner 0 lorsque NULL?

Exemple de DDL ci-dessous - et j'ai codé en dur une clause WHERE qui ne renvoie rien juste à des fins d'illustration, idéalement je veux renvoyer tout usernames et le plus haut logincount pour l'utilisateur

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

Utilisez max(coalesce(logincount, 0)) pour éviter les valeurs NULL

Selon Postgres docs (9.6) :

La fonction COALESCE renvoie le premier de ses arguments qui n'est pas nul. Null est retourné uniquement si tous les arguments sont nuls. Il est souvent utilisé pour remplacer une valeur par défaut par des valeurs nulles lorsque les données sont récupérées pour l'affichage, par exemple:

14
McNets

J'ai peut-être manqué quelque chose d'évident ici, mais la fonction NULLIF ne serait-elle pas une solution bien meilleure (et plus élégante)?

Documentation Postgres ici .

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

Résultat:

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