MW211 EXIT

devlog
PostgreSQL/NULLの処遇のおさらい
2013年02月01日
レコード上にNULLが混じっていた場合どうなるのか、
以下のサンプルデータを元におさらいしてみよう。
┌──────────────────────────────────────┐
│SELECT "c" FROM (VALUES (1),(2),(NULL)) AS "t"("c");            →1、2、NULL│
└──────────────────────────────────────┘

まずは、集合関数について。
┌──────────────────────────────────────┐
│SELECT COUNT("c") FROM (VALUES (1),(2),(NULL)) AS t("c");                →2│
│SELECT MAX("c")   FROM (VALUES (1),(2),(NULL)) AS t("c");                →2│
│SELECT MIN("c")   FROM (VALUES (1),(2),(NULL)) AS t("c");                →1│
│SELECT AVG("c")   FROM (VALUES (1),(2),(NULL)) AS t("c");              →1.5│
└──────────────────────────────────────┘
NULLはガン無視されるということだね。

次は並び順について。
┌──────────────────────────────────────┐
│SELECT "c"                                                                  │
│    FROM (VALUES (1),(2),(NULL)) AS "t"("c")                                │
│    ORDER BY "c" ASC;                                           →1、2、NULL│
│SELECT "c"                                                                  │
│    FROM (VALUES (1),(2),(NULL)) AS "t"("c")                                │
│    ORDER BY "c" DESC;                                          →NULL、2、1│
└──────────────────────────────────────┘
ただし、現状はこうですよって感じで、この順は保証されてないっぽい。

ま、動いてんだから…ってのはよくないですよね。
じゃ、NULLを厳密に管理するには?
┌──────────────────────────────────────┐
│SELECT "c"                                                                  │
│    FROM (VALUES (1),(2),(NULL)) AS "t"("c")                                │
│    ORDER BY "c" IS NULL ASC,                                               │
│             "c"         ASC;                                   →1、2、NULL│
│SELECT "c"                                                                  │
│    FROM (VALUES (1),(2),(NULL)) AS "t"("c")                                │
│    ORDER BY "c" IS NULL DESC,                                              │
│             "c" DESC;                                          →NULL、2、1│
└──────────────────────────────────────┘
並び順に「IS NULL」をつけてやればよい。
分類:PostgreSQL