裏MySQL クエリー入門 (1) ELTとFIELD
ブログコンテストも終わってしまったので、MySQLの実践TIPSを書いていこうと思います。
一般的なSQLの他のサイトの解説に譲るとして、ちょっと横道にそれて、MySQL独自関数を使った実践TIPSを紹介していきたいと思います。
まず第一弾は『ELT/FIELD』、MySQLマニュアルを読むと
- ELT(N,str1,str2,str3,...)
N = 1 の場合は str1 を戻し、N = 2 の場合は str2 を戻す、というふうに続きます。N が 1 以下か、引数の数より大きければ、NULL を戻します。ELT() は FIELD() の補数です。
と書かれています。がこれだけだと良く分かりません。
具体的な実践例をあげると例えば、ユーザテーブル(user)で『sex』という性別を示すカラムがあったとします、1:男 2:女といった意味でtinyint型で値が格納されているとします。その場合に文字列として表示したい場合に以下のようなSQLを使うことで表示できます。
SELECT elt(sex,'男','女') FROM user
ようするに、SQL中で使える配列だと思って頂ければ分かりやすいかもしれません。
phpで書くとこんな感じですね。
<?php $arr=array(1=>'男','女'); $arr[$sex];
- FIELD(str,str1,str2,str3,...)
str1 、str2 、str3 、... リストの str の開始位置 ( ポジション ) を戻します。str が見つからない場合は、0 を戻します。 FIELD() へのすべての引数がストリングの場合、すべての引数はストリングとして比較されます。すべての引数が数値の場合、それらは数値として比較されます。それ以外は、引数は double として比較されます。 str が NULL である場合、NULL はいかなる値との比較でも等価にならないため、戻り値は 0 になります。FIELD() は ELT() の補数です。
FIELDはELTの反対の動きをする関数です。
SELECT field(sex_str,'男','女') FROM user
主な用途としてはeltと組み合わせてkey-valueのhashのように使ったり、いけてないDB設計*1を修正するのに使います。また、クロス集計に使われたりしますが、実は次の裏MySQL クエリー入門 (2)を組み合わせるとクロス集計での出番がなくなったりします。こちらについては後述
この関数はOracleの『DECODE』関数にあたるもので、この関数を『FIELD』と『ELT』と『IFNULL』に分離したものといったイメージです。
- DECODE(exp,key1,val1,key2,val2....,default_val)
SELECT decode(sex,'1','男','2','女','中性') FROM user
*1:何故かintで管理するところをvarcharで管理しているようなDBとか