裏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とか