web-dev-qa-db-ja.com

NullのときにPostgresqlが0を返す

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
7
Michael Mormon

NULLを回避するにはmax(coalesce(logincount, 0))を使用してください

Postgres docs(9.6) によると:

COALESCE関数は、nullでない最初の引数を返します。 Nullは、すべての引数がnullの場合にのみ返されます。データを取得して表示するときに、デフォルト値をnull値の代わりに使用することがよくあります。次に例を示します。

14
McNets

多分私はここで明白な何かを見逃したかもしれませんが、 [〜#〜] 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
0
Vérace