类PostgreSQL不返回匹配实例

类PostgreSQL不返回匹配实例,postgresql,sqlite,pattern-matching,sql-like,Postgresql,Sqlite,Pattern Matching,Sql Like,PostrgeSQLlike函数是如何工作的?我使用令牌输入来限制用户仅使用现有值的输入 我在DB中有以下值: `Yellow, White, Orange...` 我的代码 @colors = Color.where("name like ?", "%#{params[:q]}%") 如果我输入w,例如White,则不建议输入。我得打第二封信才能看到怀特求婚。因为Db值都以大写字母开头,所以我怀疑与SQLite不同 我发现了这篇文章,其中提到了ILIKE,但我想知道是否有一些通用的代

PostrgeSQL
like
函数是如何工作的?我使用令牌输入来限制用户仅使用现有值的输入

我在DB中有以下值:

  `Yellow, White, Orange...`
我的代码

 @colors = Color.where("name like ?", "%#{params[:q]}%")
如果我输入
w
,例如
White
,则不建议输入。我得打第二封信才能看到怀特求婚。因为Db值都以大写字母开头,所以我怀疑与SQLite不同


我发现了这篇文章,其中提到了
ILIKE
,但我想知道是否有一些通用的代码同时适用于Postgres和SQLite。

SQLite
LIKE
操作符默认不区分大小写。
在PostgreSQL中,
ILIKE
LIKE
的不区分大小写版本。还有一些运营商:

~~   .. LIKE
~~*  .. ILIKE
!~~  .. NOT LIKE
!~~* .. NOT ILIKE
这三个表达式在PostgreSQL中实际上是相同的:

name ilike '%w%'
name ~~*   '%w%'
lower(name) like lower('%w%')
最后一行主要在和中起作用。我添加了相应手册页面的链接


存在一个限制:SQLite只理解ASCII字符的小写/大写,而PostgreSQL也理解其他UTF-8字符。

LIKE的大小写敏感度取决于您使用的数据库。有些数据库在使用时忽略大小写,有些则不忽略,有些则查看各种配置选项。解决此问题的一种方法是通过转换为大写或小写来规范大小写:

@colors = Color.where("lower(name) like ?", "%#{params[:q].downcase}%")

存储逗号分隔的值通常是有问题的数据库设计的标志。感谢对数据库的完整解释。