こんにちは。株式会社LiemPiaのtampopo256です。
普段は教育系のWebサービス「clemy」を作ったりしています。
さて、MySQLって結構長い付き合いなんですが、使えば使うほど、
「え、こんな関数あったの!?」
ということが出てきます。
今回は、意外と知られていないけど、地味に便利なMySQLの関数たちを紹介します。
1. FIELD():値の「順位」を返すやつ
たとえば、こういうやつ。
SELECT FIELD('banana', 'apple', 'banana', 'orange'); -- → 2
「banana」は2番目に出てきたので、結果は2。
見つからないと0になります。
SELECT FIELD('grape', 'apple', 'banana', 'orange'); -- → 0
これ、地味に便利で、手軽な並び順カスタムに使えます。
ORDER BY FIELD(status, 'pending', 'review', 'done')
これで、SQLだけでカスタムソートできます。
CASE WHENでゴリゴリ書いてた自分、さようなら👋
2. ELT():インデックスから値を引く逆バージョン
これはFIELD()の逆みたいなやつです。
SELECT ELT(2, 'apple', 'banana', 'orange'); -- → banana
インデックス2を指定すると、2番目の'banana'を返します。
地味にENUMのラベル化とかに使えたりします。
3. FIND_IN_SET():カンマ区切り文字列を検索できる
SELECT FIND_IN_SET('banana', 'apple,banana,orange'); -- → 2
「banana」は2番目に出てきた、という意味。
つまり、DB設計が微妙で、CSVで値が入ってるテーブルに出会ったときの救済関数。
SELECT * FROM fruits WHERE FIND_IN_SET('apple', tags);
※もちろん正規化したほうが良いです。
- IFNULL()とNULLIF():名前がややこしい双子関数
違い、ちゃんと覚えてますか?
SELECT IFNULL(NULL, 'default'); -- → 'default'
こっちはNULLだったら第2引数を返すやつ。
SELECT NULLIF(1, 1); -- → NULL
SELECT NULLIF(1, 2); -- → 1
こっちは「2つが等しければNULLを返す」。
0で割るなエラーを避けるときに役立ちます。
SELECT 10 / NULLIF(0, 0); -- → NULLになるからエラー回避
地味だけど、覚えておくと助けてくれます。
5. STR_TO_DATE() と DATE_FORMAT() の合わせ技
日付フォーマットを変換するとき、毎回ググってませんか?
SELECT STR_TO_DATE('2025/06/17', '%Y/%m/%d'); -- → '2025-06-17'
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- → '2025年06月17日'
人に読ませる用にもってこい。
おわりに
MySQLって、なんかいつも COUNT(*) と GROUP BY しか使ってない気がしますよね。
でも、こういう地味な関数たちもちゃんと使ってあげると、
「SQL、ちょっと気が利くじゃん?」
って思えたりします。
今回紹介した関数たちは、clemyの運用でもちょこちょこ使っていて、「あ〜これあったんだ助かる〜」ってなった子たちばかりです。
もし他にも「これ使えるよ!」っていう関数があれば、コメントで教えてもらえると嬉しいです 🙌