Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

SQLの in で指定した順番に、一発でソートする方法あれこれ

More than 1 year has passed since last update.

はじめに

入門書片手にプログラミングに挑戦するとき、はじめて使うデータベースがMySQLという方は多いかと思います。

MySQLはいろいろなSQLの書き方ができるので、「もしかしたらこんな書き方できるかな?」と思って試してみると、結構いろいろイケます。

今回は 「where句の in ('あれ','これ','それ')」で指定した順番にいっぱつでソートしてデータ取得する方法あれこれです。

サンプルデータ

mysql> select * from sample;
+---------+----------+
| kubunti | imi      |
+---------+----------+
| A       | 申請前   |
| B       | 申請中   |
| C       | 承認中   |
| D       | 承認済み |
| E       | 申請取下 |
+---------+----------+

A:申請前、E:申請取下 B:申請中 の3レコードだけ取得したいときは、in を使ってこう書きますね。

mysql> select * from sample where kubunti in ('A','E','B');
+---------+----------+
| kubunti | imi      |
+---------+----------+
| A       | 申請前   |
| B       | 申請中   |
| E       | 申請取下 |
+---------+----------+

取得したい3レコードは取得できましたが、並び順がA→E→Bではないので、in で指定した通りA→E→Bの並び順で取得する方法をご紹介します。

方法1 order by FIELD

並び順を指定する order by の後に FIELD() を使ってソート順を指定できます。

mysql> select * from sample 
 where kubunti in ('A','E','B') 
 order by FIELD(kubunti,'A','E','B');
+---------+----------+
| kubunti | imi      |
+---------+----------+
| A       | 申請前   |
| E       | 申請取下 |
| B       | 申請中   |
+---------+----------+

in で指定した順番どおり並び順がA→E→Bとなりましたね。

方法2 case when

こちらは、無理くりっぽいですが、、

mysql> select * from sample 
 where kubunti in ('A','E','B') 
 order by (case kubunti when 'A' then 1 when 'E' then 2 else 3 end);
+---------+----------+
| kubunti | imi      |
+---------+----------+
| A       | 申請前   |
| E       | 申請取下 |
| B       | 申請中   |
+---------+----------+

方法3 if else

さらに無理くりっぽいですが、Excel関数が得意な方には馴染みのある書き方かと。

mysql> select * from sample 
 where kubunti in ('A','E','B') 
 order by IF(kubunti = 'A', 1, IF(kubunti = 'E', 2, 3));

+---------+----------+
| kubunti | imi      |
+---------+----------+
| A       | 申請前   |
| E       | 申請取下 |
| B       | 申請中   |
+---------+----------+

注意点

プログラミングにある程度馴染みのある方は、お察しのとおり
実行コスト(SQLの処理速度ですね)が良いとは言えません。

ですので、大量データを取得する場合ではなく、上記例のようにデータ量が限られていて処理性能が要求されない場合に使いましょう。

さいごに

今回は「in での指定順通りにソートしたい」という目的を例に
FIELD、case when、if else の3つの書き方をご紹介しましたが、
要するに、「こんなことしてみたいな」と思ったときに、
意外とSQLだけでもアレコレできるということです。

SQLでアレコレできると、SQLでデータ取得した後にプログラム側でループしながら成型したり並び順いじくったりしなくてよいため、コードが短く書けるという利点があります。

特に case when や if else をうまく使えば、もっと複雑な並び順指定もできます。
(処理性能にはご注意を)

入門書で言語仕様をある程度理解したら「思いつきでとりあえず書いてみる!」「書いてみて動かなかったら調べてみる!」というのが、楽しく学べてよいのではないでしょうか。

pmtech
自治体・ユーザ企業の発注側の視点からのコンサルティング、開発パートナーの受注側の視点からのエンジニアリングサービスを提供する企業です。
https://www.pmtech.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away