読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

頭文字検索

SQL MySQL

用語集みたいなやつを作っていて、「あ行」「か行」…「英数字」という頭文字検索があったので、
調べてみたところLIKEかREGEXPが使えそうかなと思ったのですが…

LIKE
→複雑な正規表現は使用不可
→日本語に対応

REGEXP
正規表現使用可
→日本語に非対応

でした。

日本語対応版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にしろ、ご利用は計画的に。

あとは、根本的な対策として、インデックス用フィールドみたいなのを作っても良いかもしれませんね。
「あ行」「か行」みたいなのを読みから判断するのではなく、それ自体を持たせる形で。

ちなみにAccess等、一部のSQLではLIKEに正規表現使えるそうです。
うらやましい。