#はじめに
入門書片手にプログラミングに挑戦するとき、はじめて使うデータベースが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 をうまく使えば、もっと複雑な並び順指定もできます。
(処理性能にはご注意を)
入門書で言語仕様をある程度理解したら「思いつきでとりあえず書いてみる!」「書いてみて動かなかったら調べてみる!」というのが、楽しく学べてよいのではないでしょうか。