14
10

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 3 years have passed since last update.

Railsの検索メソッドの基礎(whereでLIKE句を使う)

Last updated at Posted at 2021-01-22

めちゃくちゃ曖昧に理解していたこんな文

検索用メソッドで出てくるこんな文。めちゃくちゃ曖昧に理解していたので、復習します。

@users = User.where('name LIKE ?', "%#{params[:name]}%")

('name LIKE ?', "%#{params[:name]}%")はどういう意味かというと...(ちゃんとRailsガイドに書いてあった)

検索に使う語句が可変である時の書き方らしい。
第一引数(name LIKE ?)の?の部分が、第二引数(%#{params[:name]}%)と置き換えられる。

そして、whereでは、上と下の書き方は同じ結果が得られる。

@users = User.where(name: 'sato')
@users = User.where("name = 'sato'")
# どちらもidが1のデータが得られる

発行されるSQLは若干異なるが、それぞれこんな感じ。

SELECT `users`.* FROM `users` WHERE `users`.`name` = 'sato';
SELECT `users`.* FROM `users` WHERE (name = 'sato');

User.where('id = 1')id = 1が、
SQL文のWHERE (id = 1)に入っているイメージか。

**【注】**この書き方はSQLインジェクションの可能性があるので、実際には書かない用が良い。

SQL

一方で、SQLでのLIKE句はこのように使う。

SELECT 列名 FROM テーブル名 WHERE 列名 LIKE '検索文字';

↑ちなみに、これは「完全一致」の時

  • '%検索文字列'...前方一致
  • '検索文字列%'...後方一致
  • '%検索文字列%'...部分一致

改めて、最初の文と合わせてみる

では、改めて、最初の文を眺めてみる。

@users = User.where('name LIKE ?', "%#{params[:name]}%")

この時、仮に**「sato」**という文字列がparams[:name]として渡ってきていると仮定すると、

@users = User.where('name LIKE ?', "%sato%")

となり、

SELECT `users`.* FROM `users` WHERE (name LIKE '%sato%');

このようなSQLが発行され、nameが**「sato」**さんのデータだけが抽出される。

追記:LIKE句で複数単語検索をしたい場合

今回、実現したいことはLIKEでの複数単語検索だったので、LIKE句の複数単語検索ではどのようなSQLが発行されるのか調べてみました。

例えば、住所録の中から%山%さんと%川%さんをOR検索で探したい時には、

SELECT * FROM users WHERE name LIKE '%山%'
                       OR name LIKE '%川%';

らしいので、
Railsで複数単語検索を実現するには、キーワードを配列に入れて、eachで回して、それぞれで、下記の処理をすれば良さそうですね^^

@users = User.where('name LIKE ?', "%#{params[:name]}%")

続きは次回、実装します〜

14
10
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
14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?