[SQLite] 検索時に、全角スペースと半角スペースのどちらもSELECTする方法

SQLでデータを検索する時に、複数人がマスターを登録するシステムの場合に、文字の区切りを半角スペースと全角スペースが入り交じる事があります。 こうした場合に、厳密に検索するのではなく、半角でも全角でもどちらのスペース文字列も検索対象にしたい時にどうすればいいか、対応したスニペットを掲載します。

データサンプル

名前リスト

id | name 1 | 田中 一郎 2 | 田中 二郎 3 | 田中 三郎

半角スペースのSELECT文

SELECT * FROM NameList WHERE name LIKE '%田中 %'

検索結果

id | name 2 | 田中 二郎 3 | 田中 三郎

全角スペースのSELECT文

SELECT * FROM NameList WHERE name LIKE '%田中 %'

検索結果

id | name 1 | 田中 一郎

半角・全角スペースの曖昧検索

SELECT * FROM NameList WHERE replace(replace(name , " ","")," ","") LIKE replace(replace('%田中 %' , " ","")," ","")

検索結果

id | name 1 | 田中 一郎 2 | 田中 二郎 3 | 田中 三郎

解説

replace機能を使い、次のようにすることで、任意文字列を削除(ブランクに置換)しています。 replace(name , "削除する文字列(半角、全角スペース)","置換する文字列(ブランク文字列)") 次のように、半角と全角をあわせ技で一気に削除します。 replace(replace(name , " ","")," ","") 前後のスペースやタブなどを取り去るtrimを使って、より安定した曖昧検索をするのもいいでしょう。 trim(replace(replace(name , " ","")," ",""))

phpとの組み合わせ

PHP内でselect文を作っている場合は、次のサンプルを参考にしてください。 $value = '田中 '; $select = 'SELECT * FROM NameList WHERE replace(replace(name , " ","")," ","") LIKE "%'. del_space($value) .'%"' function del_space($vallue=''){ $value = str_replace(' ' , '', $vallue); $value = str_replace(' ', '', $vallue); return $value; } del_space関数で、半角・全角スペースを取り除いてあげます。 その後、上記の様にselect文を作ってから、sqliteを実行すると、少し挙動が軽くなると思います。