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
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:
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