MW211 EXIT

devlog
PostgreSQL/前後のIDを取得
2013年08月14日
昇順の一意ID(列)を基準として、前後のIDを調べる場合のSQL文。

先頭および末尾においては、その先がNULLになるパターン。
┌──┬───────────────────────────────────┐
│前へ│SELECT 列                                                             │
│    │    FROM 表                                                           │
│    │    WHERE 列 < 値                                                     │
│    │    ORDER BY 列 DESC                                                  │
│    │    LIMIT 1;                                                          │
├──┼───────────────────────────────────┤
│次へ│SELECT 列                                                             │
│    │    FROM 表                                                           │
│    │    WHERE 列 > 値                                                     │
│    │    ORDER BY 列 ASC                                                   │
│    │    LIMIT 1;                                                          │
└──┴───────────────────────────────────┘

先頭および末尾においては、一周するパターン。
┌──┬───────────────────────────────────┐
│前へ│SELECT coalesce((SELECT 列                                            │
│    │                     FROM 表                                          │
│    │                     WHERE 列 < 値                                    │
│    │                     ORDER BY 列 DESC                                 │
│    │                     LIMIT 1),                                        │
│    │                (SELECT max(列)                                       │
│    │                     FROM 表));                                       │
├──┼───────────────────────────────────┤
│次へ│SELECT coalesce((SELECT 列                                            │
│    │                     FROM 表                                          │
│    │                     WHERE 列 > 値                                    │
│    │                     ORDER BY 列 ASC                                  │
│    │                     LIMIT 1),                                        │
│    │                (SELECT min(列)                                       │
│    │                     FROM 表));                                       │
└──┴───────────────────────────────────┘
分類:PostgreSQL