ILIKE在字符串中的搜索仅适用于其第一部分?

时间:2016-05-12 05:46:47

标签: mysql ruby-on-rails ruby

我有一个Users表,其中name字段包含用户的全名。

我写了一个搜索功能,应该允许用他们的名字或姓氏来查找用户,但它只返回名字的结果。

例如,如果我有一位用户:user.name = 'John Smith',如果我输入' John'我得到了记录,但如果我进入史密斯'我没有结果。这是我的搜索代码:

name_users = User.where('name ILIKE ?', params["search_text"] + '%').all

如何允许按姓氏搜索?

3 个答案:

答案 0 :(得分:2)

试试这个:

name_users = User.where('name ILIKE ?', "%#{params["search_text"]}%")

答案 1 :(得分:2)

LIKEILIKE进行模式匹配,最后使用%,您只匹配字符串开头的字词,因此您可以匹配仅限名字。由于姓氏在字符串前面有字符,因此不匹配。 Postgres docs

  

LIKE模式匹配始终覆盖整个字符串。为了匹配字符串中任何位置的模式,模式必须以百分号开头和结尾。

您应该在查询开头添加%来匹配开头和结尾:

name_users = User.where('name ILIKE ?', "%#{params["search_text"]}%")

答案 2 :(得分:1)

您可以充分利用SQL。因此,您可以在搜索的文本之前添加另一个%,以指示您要在列中的任何位置搜索字符串匹配。

query = "%#{params['name']}%"
User.where('name ILIKE ?', query)

您不需要all