はじめに
Rails アプリにおいて、直接 SQL を実行してレポートを作成するときに、blazer という gem を使っています。
こちらの gem で SQL の LIKE 句を使い、部分一致のキーワードで変数を使おうと思ったときに少しハマったので、調べたことをまとめます。
課題
以下のように、LIKE 句を使った部分一致で、hoge
というキーワードが含まれている name
を検索する SQL を書くとします。
SELECT
name
FROM
users
WHERE
name LIKE '%hoge%'
この hoge
の部分を変数にして、任意のキーワードで部分一致を使えるようにすると便利そうだと思ったので、hoge
の部分を {keyword}
と書き換えました。
※変数の使い方は README 参照
SELECT
name
FROM
users
WHERE
name LIKE '%{keyword}%'
しかし、こちらで例えば fuga
というキーワードで SQL を実行しようとすると、fuga
の両端がシングルコーテーションで囲まれてしまい、SQL 構文エラーになってしまいました。
SELECT
name
FROM
users
WHERE
name LIKE '%'fuga'%'
ここからシングルコーテーションを外せないかなど色々試したのですがうまくいかず、ハマった状態が続きました。
解決策
あれこれ調べていたところ、以下の issue に解決策が記載されていました。
Support for variables that are already inside quotes · Issue #179 · ankane/blazer · GitHub
変数の両端からシングルコーテーションを取り除くのではなく、それぞれを文字列として扱い、連結させれば OK とのことでした。
DB で PostgreSQL を使っている場合は、変数と%
の間に ||
演算子を入れます。
SELECT
name
FROM
users
WHERE
name LIKE '%' || {keyword} || '%'
DB で MySQL を使っている場合は、CONCAT
関数で連結させます。
SELECT
name
FROM
users
WHERE
name LIKE CONCAT('%', {keyword}, '%')
終わりに
使っているライブラリで困ったときには、そのリポジトリの issue を追ってみるとヒントがあることが多いなと思いました。
issue ともっと親しくなっていきたいと思います。