4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?