当前位置:  开发笔记 > 后端 > 正文

Rails MySQL ILIKE查询

如何解决《RailsMySQLILIKE查询》经验,为你挑选了2个好方法。

我的语法已关闭.我想创建一个范围by_name,查找所有agencies其name属性包含传入的字符串(不区分大小写).

这是我有的:

class Agency < ActiveRecord::Base
  scope :by_name, ->(agency_name) { where('name ILIKE ?', "%#{agency_name}%") }
end

在rails控制台中输入agencies = Agency.by_name("foo").这是生成的查询:

SELECT `agencies`.* FROM `agencies`  WHERE (name ILIKE '%foo%')

这是错误消息:

Mysql2 ::错误:您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以便在'ILIKE'%foo%'附近使用正确的语法

Andrey Deine.. 17

我认为它应该是:

 scope :by_name, lambda { |agency_name| 
   where('name LIKE ?', "%#{agency_name}%") # not ILIKE
 }

在PostgreSQL中,可以使用关键字ILIKE而不是LIKE来根据活动区域设置使匹配不区分大小写.这不是SQL标准,而是PostgreSQL扩展.

在MySQL中你没有ILIKE.在字符串比较函数上查看MySQL文档.


奖金 - 您也可以使用Arel.看一看:

scope :by_name, lambda { |agency_name| 
  where(Agency.arel_table[:name].matches("%#{agency_name}%"))
}


D-side.. 7

为什么是,因为在MySQL中没有这样的东西ILIKE.只有LIKE.你可能已经看到PostgreSQL中的ILIKE一个不区分大小写的版本LIKE,但你当前的RDBMS是不同的.

你最好的选择是LOWER双方使用以达到大致相同的效果:

.where('LOWER(name) LIKE LOWER(?)', "%#{agency_name}%")

感谢@mu太短了他的答案.



1> Andrey Deine..:

我认为它应该是:

 scope :by_name, lambda { |agency_name| 
   where('name LIKE ?', "%#{agency_name}%") # not ILIKE
 }

在PostgreSQL中,可以使用关键字ILIKE而不是LIKE来根据活动区域设置使匹配不区分大小写.这不是SQL标准,而是PostgreSQL扩展.

在MySQL中你没有ILIKE.在字符串比较函数上查看MySQL文档.


奖金 - 您也可以使用Arel.看一看:

scope :by_name, lambda { |agency_name| 
  where(Agency.arel_table[:name].matches("%#{agency_name}%"))
}



2> D-side..:

为什么是,因为在MySQL中没有这样的东西ILIKE.只有LIKE.你可能已经看到PostgreSQL中的ILIKE一个不区分大小写的版本LIKE,但你当前的RDBMS是不同的.

你最好的选择是LOWER双方使用以达到大致相同的效果:

.where('LOWER(name) LIKE LOWER(?)', "%#{agency_name}%")

感谢@mu太短了他的答案.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有