MW211 EXIT

devlog
PostgreSQL/順番の末尾にデータを追加したい場合
2011年10月23日
順番を示す項目について、データを追加する場合に
その時点で存在するデータの最大値に+1して追加したい場合、
以下のようにSELECTで最大値をひっぱてきて、それに+1してINSERTする。
┌──────────────────────────────────────┐
│INSERT INTO "表"                                                            │
│           ("名前","順番")                                                  │
│    SELECT '文字',                                                          │
│           MAX("順番") + 1                                                  │
│        FROM "表";                                                          │
└──────────────────────────────────────┘
しかし、これだと最初に追加する場合、エラーになってしまう(データが追加できない)。
つまり、順番を示す項目の最大値が該当なしでNULLとなってしまい、+1できないのだ。

そこで、ひと手間。
以下のようにNULLの場合に0に変換する「COALESCE()」をはさんであげるとよい。
#COALESCE()は引数(配列)中のNULLじゃない最初のデータを採用する関数
┌──────────────────────────────────────┐
│INSERT INTO "表"                                                            │
│           ("名前","順番")                                                  │
│    SELECT '文字',                                                          │
│           COALESCE(MAX("順番"), 0) + 1                                     │
│        FROM "表";                                                          │
└──────────────────────────────────────┘
ちなみに、SELECTは()で括れば個別に引用できるので、以下のようにもできる。
┌──────────────────────────────────────┐
│INSERT INTO "表"                                                            │
│           ("名前","順番")                                                  │
│    VALUES ('文字',                                                         │
│            COALESCE((SELECT MAX("順番")                                    │
│                          FROM "表";                                        │
│                     ), 0) + 1;                                             │
└──────────────────────────────────────┘
これだと複数のテーブルから様々な項目を参照できる。
分類:PostgreSQL