【问题标题】:How to make postgresql search method case-insensitive?如何使 postgresql 搜索方法不区分大小写?
【发布时间】:2015-05-04 22:32:58
【问题描述】:

我刚从 sqlite3 切换到 postgresql-9.4。以前,当我使用“typeahead”方法进行搜索时,我会得到不区分大小写的结果。但是现在我切换了,该方法突然区分大小写。如何使用 postgresql 使方法不区分大小写?

def typeahead
  q = params[:query]
  render json: Subject.where('name like ? OR second_name like ? OR keywords like ?', "%#{q}%", "%#{q}%", "%#{q}%")
end

【问题讨论】:

  • 通常情况下,如果您有要搜索的值字段,则应在插入前将内容折叠为小写或大写,然后在搜索时将搜索文本转换为小写或大写.这使您的代码可以在任何 DBM 上运行,而无需依赖 DBM 特定的函数。

标签: sql ruby-on-rails ruby postgresql


【解决方案1】:

我认为你可以使用 ILIKE 代替 LIKE

 Subject.where('name ilike ? OR second_name ilike ? OR keywords ilike ?', "%#{q}%", "%#{q}%", "%#{q}%")

或者简化一点

 Subject.where('name ilike :name OR second_name ilike :name OR keywords ilike :name', name: "%#{q}%")

【讨论】:

  • 这很好用,但值得注意的是它是特定于 PostgreSQL 的。
【解决方案2】:

您也可以使用“ilike”关键字代替“like”。

【讨论】:

    【解决方案3】:

    常见的做法是这样做:

    Subject.where('LOWER(name) like ?, "%#{q.downcase}%")
    

    请注意,如果遇到性能问题,您可能需要创建小写索引。见:How do I create an index in PostgreSQL based on lowercase only?

    【讨论】:

    • 我明白了,很好的解决方案!我也可以q = params[:query].downcase 来节省一些计算能力吗?
    • JoeMorano 是的,你可以,但你不应该太在意这种类型的优化,因为它的影响可以忽略不计,相反,你应该关注性能问题,如 IO 和数据库问题以及网络问题,如Drenmi 在他的回答中提到。
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 2015-04-22
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多