LIKE的条件查询与完全匹配不匹配

时间:2011-05-17 18:50:34

标签: ruby-on-rails ruby-on-rails-3 postgresql

我正在使用以下查询来搜索用户:

  @users = User.find( :all,
                      :select => 'users.*',
                      :conditions => ["lower(fname) || ' ' || lower(lname) LIKE ?", '%'+"#{params[:q].downcase}"+'%'],
  )

这适用于以下示例:

Bob S find Bob Smith
Bob finds Bob Smith

问题是

Bob Smith does not find Bob Smith

如何才能获得上述查询以返回完全匹配?感谢

1 个答案:

答案 0 :(得分:2)

查询完全错误。首先,'||'不是连接运算符。其次,运算符优先级使其评估为:

(lower(fname)) || (' ') || (lower(lname) LIKE '%Bob Smith%')

这不是你想要的。我想你会喜欢它:

concat(lower(fname), ' ', lower(lname)) LIKE '%Bob Smith%'

编辑:所以你可以使用:

@users = User.find( :all,
                  :select => 'users.*',
                  :conditions => ["concat(lower(fname), ' ', lower(lname)) LIKE ?", "%#{params[:q].downcase}%"])

EDIT2:以上是错误的,我没有注意到它是关于Postgresql的。有一个'||' Postgres中的串联运算符当然。我不是因为下面的评论而删除这篇文章,但请不要使用它。