頭文字検索
※MySQLを前提として書いています
用語集みたいなやつを作っていて、「あ行」「か行」…「英数字」という頭文字検索があったので、
調べてみたところLIKEかREGEXPが使えそうかなと思ったのですが…
LIKE
→複雑な正規表現は使用不可
→日本語に対応
でした。
日本語対応版REGEXPであるMREGEXPというものもあるのですが、
会社の環境なのでインストールはちょっと…。
参考
mregexp - MySQLで日本語の正規表現を扱う
LIKEを使うとしたら
-- あ行 SELECT * FROM `table` WHERE `yomi` LIKE 'あ%' OR `yomi` LIKE 'い%' OR `yomi` LIKE 'う%' OR `yomi` LIKE 'え%' OR `yomi` LIKE 'お%' -- 英数字 SELECT * FROM `table` WHERE `yomi` LIKE '0%' OR `yomi` LIKE '1%' -- (中略) OR `yomi` LIKE 'a%' OR `yomi` LIKE 'b%' -- (中略) OR `yomi` LIKE 'z%'
…これはひどい。
REGEXPを使うなら
-- あ行 SELECT * FROM `table` WHERE `hoge` REGEXP '^(あ|い|う|え|お)' -- 英数字 SELECT * FROM `table` WHERE `hoge` REGEXP '^([0-9]|[a-z])'
という形になるはず。
ダメもとで試してみたところ、
例えば「あ行」の検索だと、確かに「あ~おのいずれかで始まる単語」はすべてヒットするのですが、
他の一部の単語もヒットしてしまいました。ほんとにダメかー。
ということで、日本語頭文字はLIKE検索・英数字はREGEXP検索、とすることにしました。
MREGEXPが使用可能ならこちらを使ってもよいと思いますが、LIKEの方が速度は速いようです。
データ量や正規表現の有無を考えて、MREGEXPにしろREGEXPにしろ、ご利用は計画的に。
あとは、根本的な対策として、インデックス用フィールドみたいなのを作っても良いかもしれませんね。
「あ行」「か行」みたいなのを読みから判断するのではなく、それ自体を持たせる形で。