Help us understand the problem. What is going on with this article?

blazer で SQL の LIKE 句による部分一致検索で変数を使う

はじめに

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 ともっと親しくなっていきたいと思います。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした