我在项目中使用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”。
答案 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)