像查询一样不会缩减预期结果

时间:2016-04-19 10:22:52

标签: sql ruby-on-rails postgresql

我在项目中使用Rails 4.2并使用postgresql for Database。

当我正在使用'赞'查询时,我得不到正确的结果。请阅读以下完整说明。

Campaign.where('lower (brand_name) LIKE ?', "%#{params[:brand_name]}%")

现在这个查询有什么问题,假设我用brand_name("brand-10%")创建了记录,然后我通过在brand_name列中传递参数like "10%"来搜索记录,然后这个查询没有返回精确记录。它返回所有“10”作为brand_name的记录。

我检查了查询,它正在进行SQL查询,如:

SELECT "campaigns".* FROM "campaigns" WHERE (lower (brand_name) LIKE '%10%%')

但现在我想要的是查询应该应用于“10%”而不是“10”。

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为%是通配符并匹配0个或更多字符。因此,在字符串%%的末尾加'%10%%''%10%'没有区别。

您需要转义第一个%以使其与文字百分号匹配。根据postgresql手册,你需要在其前面加上默认为\的转义字符。不幸的是,\是红宝石的转义字符,因此您需要使用\\来表示\

  

匹配文字下划线或百分号而不匹配其他符号   字符,模式中的相应字符必须以   逃避角色。默认转义字符是反斜杠   但是可以使用ESCAPE子句选择不同的一个。至   匹配转义字符本身,写两个转义字符。

http://www.postgresql.org/docs/current/static/functions-matching.html

我只使用postgresql不能使用ruby-on-rails。完全脱离我的头顶,这将是:

Campaign.where("lower (brand_name) LIKE '%' || replace(?, '%', '\\%') || '%'", "#{params[:brand_name]}")

答案 1 :(得分:0)

请检查此网址

https://github.com/rails/rails/issues/6104

这个解决方案对我有用。