2016-08-18  SQLITE3で複数列の文字列を検索する

検索したい文字列が,ひとつの列ではなく複数の列に存在するとき,ひとつひとつの列を検索しようとすると,条件式とOR条件だらけになってしまいます。

列を結合してから検索すれば,条件式をひとつにできます。

コード例

SELECT *
 FROM table
 WHERE COALESCE(column1,'')
  ||':'||COALESCE(column2,'')
  ||':'||COALESCE(column3,'')
  LIKE '%ぐりとぐら%'

要点

  • ひとつひとつの列を||で結合する。SQLITE3には,CONCAT関数が存在しないので,文字列の結合には,||演算子を使う
  • 列を結合する際は,区切り子(","や":"など)を挟む
  • COALESCE関数で,NULL値を空文字列(長さ0の文字列)に変換する。NULL値を含んだまま結合してしまうと,日本語の特定の文字を検索したときに検索漏れが発生する。(ASCII文字に限定すると,NULLを含む列を結合しても,検索漏れは発生しないようです)

問題点

  • 常に全走査になる。インデックスが効かない