[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を実行すると、少し挙動が軽くなると思います。