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など)では使えない点に注意が必要です。
注意点・よくある落とし穴
ここでいくつか注意すべきポイントをご紹介いたします。
まとめ
今回は、PostgreSQLで特定の値を上に表示する並び順の作成方法について解説いたしました。
特に一覧画面や管理用テーブルなど、「重要な情報をすぐに確認したい」といった場面では非常に役立ちます。
ぜひ、皆さまのSQLライフにお役立てください!
もしこの内容を通して、PostgreSQLについてさらに理解を深めたいと感じられたなら、信頼できる講座や書籍を紹介した別記事をご覧いただくのも良いかと思います。ご自身の学びに、きっとお役立ていただけるはずです。
コメント