MAX()
を使用してクエリを実行しようとしていますが、私の問題は、フィールドにNULL
値が含まれている場合、データが何も返さないことです。テーブルの更新はオプションではないので、NULL
のときにこのクエリを0を返すように書き換えるにはどうすればよいですか。
以下のDDLのサンプル-WHERE
句をハードコードしました。これは、説明のためだけに何も返しません。理想的には、すべてのusernames
とユーザーの最高のlogincount
を返します
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
NULLを回避するにはmax(coalesce(logincount, 0))
を使用してください
Postgres docs(9.6) によると:
COALESCE関数は、nullでない最初の引数を返します。 Nullは、すべての引数がnullの場合にのみ返されます。データを取得して表示するときに、デフォルト値をnull値の代わりに使用することがよくあります。次に例を示します。
多分私はここで明白な何かを見逃したかもしれませんが、 [〜#〜] nullif [〜#〜] 関数ははるかに優れた(そしてよりエレガントな)解決策ではないでしょうか?
Postgresのドキュメント ここ 。
SELECT
COUNT(NULLIF(logincount,0)) AS "Max Login Count",
username,
FROM Test
GROUP BY username
ORDER BY "Max Login Count";
結果:
'Max Login Count' username
----------------------------
0 ff12
1 jb88
2 er11