こんにちは。いっとくです!
Webアプリケーションをいじるなら絶対に避けて通ることのできないデータベースとそれを操作するSQL
先日仕事中に動いているクエリの中身を確認したところ、全然見たことのない書き方がされており困惑したので、その時の書き方をメモがてら共有していこうと思います。
ちなみに普段使っているDBの言語はMySQLなので、今回はMySQLについての話になります。
MySQLでORDER BYに整数を使うとカラムを番号で指定できるけど、CASEが入ると全然違う動きをする件
並べ替えをする際に使用するORDER句ですが、ぶっちゃけ僕は体系的にSQLを学んだ訳ではないので、時折知識の穴みたいなのがあって苦戦する時があるんですよ。
その中で過去に穴に突き落とされた書き方が、以下のような感じでORDER BYで整数だけが指定されているパターン
SELECT * FROM shops ORDER BY 2;
最初見たときは書き間違えなんじゃないかと思いました。なんだ2って。そんなカラムねーよって。
でもよくよく調べてみると、これは”整数”番目のカラムで並べ替えますよっていう書き方なんです。
つまりORDER BY 1だったら1番目のカラムでORDERするし、3だったら3番目のカラムでORDERします。
えぇ、この書き方の何が嬉しいのかはさっぱりわかりません。笑
何で並べ替えてるのかぱっと見ですぐわからない上に、もしカラムの数とかセレクトする順番が変わった時に変更箇所増えるだけなのでは…?
まぁでもあるってことは何かしらの賢い方法があるのでしょう。賢い人いたら教えてください。
さて、これと似たような書き方でORDER句とCASEを組み合わせる方法があります。
具体的には以下のような感じ。
SELECT * FROM shops ORDER BY CASE pref WEHN ‘tokyo’ THEN 1 WHEN ‘kanagawa’ THEN 2 WHEN ‘chiba’ THEN 3 WHEN ‘saitama’ THEN 4 ELSE 5 END;こう書くことでWHENの条件に当てはまるレコードの順番を任意で指定することができます。
なんかどちらも整数を指定しているだけなのに、動き方全然違いすぎて大混乱しました。
よく見たらCASEを使う場合だと、カラムが指定されているので本質の部分が異なるってのはわかるんだけど、これがCASEとWHENの間が空になっていて、WHENの条件が複雑だったりすると、ぱっと見でよくわからないんですよね。
ちなみに上記の例だと、shopsテーブルの値を全件取得して、東京、神奈川、千葉、埼玉、その他の都道府県の順番に並べ換えたものが取得できます。
まぁあんまり頻繁に書くような書き方ではないのですが、ソースコード上で見かけた時に何が起きているかを把握するためにも知っておくといいのかな〜という気がします。
Webサービスとかだと検索結果の一覧を取得する場合に、並び順が重要になる場合って結構あると思うんですけど、結構イレギュラーな対応をしないと実現できないような並び方の時には結構使う機会があるのかも??
以上、ORDER BYとCASEを組み合わせて、任意の順番に並び替える方法でした!
おしまい
コメント