我在项目中使用 Rails 4.2,数据库使用 postgresql。
当我应用“喜欢”查询时,我没有得到正确的结果。请阅读下面的完整说明。
Campaign.where('lower (brand_name) LIKE ?', "%#{params[:brand_name]}%")
现在这个查询有什么问题,假设我已经用 brand_name("brand-10%")
创建了记录,然后我通过传递参数 来搜索记录,比如 "10% "
在 brand_name 列中,此查询未返回准确的记录。它返回所有以“10”作为品牌名称的记录。
我检查了查询,它正在使 SQL 查询如下:
SELECT "campaigns".* FROM "campaigns" WHERE (lower (brand_name) LIKE '%10%%')
但现在我想要的类似查询应该应用于“10%”而不是“10”。
最佳答案
发生这种情况是因为 %
是通配符,匹配0个或多个字符。所以有 %%
在字符串的末尾 '%10%%'
与 '%10%'
没有什么不同.
您需要转义第一个 %
使其与文字百分号相匹配。根据 postgresql 手册,您需要使用默认为 \
的转义字符作为前缀。 .可惜\
是 ruby 的转义字符,所以你需要使用 \\
意思是\
.
To match a literal underscore or percent sign without matching other characters, the respective character in pattern must be preceded by the escape character. The default escape character is the backslash but a different one can be selected by using the ESCAPE clause. To match the escape character itself, write two escape characters.
http://www.postgresql.org/docs/current/static/functions-matching.html
我对 ruby-on-rails 不熟悉,只是对 postgresql 不熟悉。完全脱离了我的头脑,这看起来像:
Campaign.where("lower (brand_name) LIKE '%' || replace(?, '%', '\\%') || '%'", "#{params[:brand_name]}")
关于sql - Like 查询不返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36715574/