【问题标题】:PostgreSQL like not returning matching instancesPostgreSQL 喜欢不返回匹配的实例
【发布时间】:2011-11-21 20:26:13
【问题描述】:

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

我在数据库中有以下值:

  `Yellow, White, Orange...`

我的代码

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

如果我输入w,例如White,则不建议使用。我必须输入第二封信才能看到怀特的提议。因为 Db 值都以大写字母开头,所以我怀疑与 SQLite 有所不同。

我发现了这个post,其中提到了ILIKE,但我想知道是否有一些通用代码可以同时用于 Postgres 和 SQLite。

【问题讨论】:

  • 存储逗号分隔值通常是有问题的数据库设计的标志。

标签: postgresql sqlite pattern-matching sql-like


【解决方案1】:

默认情况下,SQLite LIKE 运算符不区分大小写。
在 PostgreSQL 中 ILIKE 是不区分大小写的 LIKE 版本。还有运营商:

~~   .. LIKE
~~*  .. ILIKE
!~~  .. NOT LIKE
!~~* .. NOT ILIKE

这三个表达式在 PostgreSQL 中实际上是相同的:

name ilike '%w%'
name ~~*   '%w%'
lower(name) like lower('%w%')

最后一行主要适用于SQLitePostgreSQL。我添加了指向相应手册页的链接。

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

【讨论】:

  • 感谢完整的 Db 解释。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多