0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-22

#はじめに
入門書片手にプログラミングに挑戦するとき、はじめて使うデータベースが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 をうまく使えば、もっと複雑な並び順指定もできます。
(処理性能にはご注意を)

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?