【PostgreSQL】特定の値を上に固定させる方法!ORDER BYの応用テクニック

スポンサーリンク

SQLでデータを並び替えるときに、

「この値だけは上に来てほしい」「特定のレコードを優先的に表示したい」

――そう思われたことはありませんか?

たとえば、注文一覧を表示する場面で、「未発送」の注文を上部に、それ以外は通常の並び順で構わないというようなケース。
あるいは、重要なステータスを一覧の先頭に出して、確認しやすくしたい――そんなご要望も実務ではよく耳にいたします。

本記事では、PostgreSQLで特定の値を最上位に表示し、残りのデータは通常通りに並べる方法について、わかりやすくご紹介していきます。

SQLの基礎を押さえつつ、実践で使えるテクニックを一緒に身につけていきましょう!

基本的なORDER BYの復習

まずは基本から確認してまいりましょう。

PostgreSQLに限らず、SQLでは ORDER BY 句を用いることで、データの並び順を指定することができます。
たとえば、orders というテーブルがあり、注文のステータス(status)を昇順で並べたい場合、以下のように記述します。

SELECT * FROM orders ORDER BY status;

このようにすれば、ステータスがアルファベット順や辞書順に並びます。
ですが、これでは「未発送」を最上位に表示したい、というようなカスタムな順番には対応できません。

そこで登場するのが次のテクニックです。

特定の値を上に表示する方法(CASE式を使う)

PostgreSQLでは CASE 式を用いることで、特定の値に順位を与えるような並べ方が可能です。
ここでは、注文ステータスのうち「未発送」と「発送準備中」を優先し、それ以外は通常通りの並びとする例を見ていきましょう。

SELECT * FROM orders
ORDER BY
  CASE status
    WHEN '未発送' THEN 0
    WHEN '発送準備中' THEN 1
    ELSE 2
  END,
  order_date DESC;

このSQLでは、CASE 式によって以下のような順位を定義しています。

  • 「未発送」 → 0(最上位)
  • 「発送準備中」 → 1(その次)
  • その他 → 2(残り)

その後に order_date DESC を指定しているため、同じグループ内では注文日時の新しいものが上に来るという形になります。

このように CASE 式を使えば、明示的に並び順を指定できるのです。非常に便利で、かつ理解しやすい方法です。

別解:IN句とARRAY_POSITIONを使う(PostgreSQL限定)

PostgreSQL特有の機能として、ARRAY_POSITION 関数を使った書き方もございます。
こちらは書き方がよりコンパクトで、視認性も高くおすすめです。

SELECT * FROM orders
ORDER BY
  ARRAY_POSITION(ARRAY['未発送', 'クレーム対応中'], status),
  order_date DESC;

この方法では、status の値が配列内で何番目にあるかを評価して、順序を決定しています。
「未発送」が 1番目、「クレーム対応中」が 2番目、それ以外の値は NULL 扱いとなり、末尾に並びます。

ただし、ARRAY_POSITION はPostgreSQL限定の機能であるため、他のRDBMS(MySQLやSQL Serverなど)では使えない点に注意が必要です。

注意点・よくある落とし穴

ここでいくつか注意すべきポイントをご紹介いたします。

  • NULLの扱い
    CASE 式や ARRAY_POSITION を使用する場合、比較対象が NULL だと正しく順位付けされません。あらかじめ COALESCE() で値を補うなどの工夫が必要です。
  • 想定外の値の出現
    配列や CASE に記述していない値が出現した場合、NULL 扱いとなって末尾に表示されます。必要なら ELSE 句で明示的に順位を与えておくと良いでしょう。
  • ORDER BYの肥大化
    CASE の条件が増えすぎると、SQLが読みづらくなります。可能であればビューに切り出すか、優先順位を持つ補助カラムを追加することもご検討ください。

まとめ

今回は、PostgreSQLで特定の値を上に表示する並び順の作成方法について解説いたしました。

  • CASE 式を使えば自由な並び順が実現できる
  • PostgreSQLならではの ARRAY_POSITION も便利
  • 応用すれば複雑な要件にも対応可能

特に一覧画面や管理用テーブルなど、「重要な情報をすぐに確認したい」といった場面では非常に役立ちます。
ぜひ、皆さまのSQLライフにお役立てください!

もしこの内容を通して、PostgreSQLについてさらに理解を深めたいと感じられたなら、信頼できる講座や書籍を紹介した別記事をご覧いただくのも良いかと思います。ご自身の学びに、きっとお役立ていただけるはずです。

PostgreSQL
スポンサーリンク
なんくるをフォローする

コメント

タイトルとURLをコピーしました