【问题标题】:Case Insensitive search with POstgres Similar To使用 POstgres 进行不区分大小写的搜索
【发布时间】:2021-06-14 21:23:52
【问题描述】:

我的 Django 代码中有这样的查询

cond = self.text_query(field.id, f'''
                                        EXISTS(
                                            SELECT *
                                            FROM {self.fieldvalue_db_view}
                                            WHERE entry_id = {self.db_table}.id AND
                                                                    {self.fieldvalue_db_view}.field_id = {field.id} AND
                                                                    {self.fieldvalue_db_view}.{text_search_column} SIMILAR TO %(pattern)s
                                        )
                                    ''', dict(pattern='%' + val + '%'))

什么时候

val = '%%john smith%%' or val = '%%john%smith%%'

它没有返回像 'John smith' 这样的结果,但是如果

val = '%%john%smith%|%smith%john%%'

它返回带有“John smith”的结果。

如何解决这种区分大小写的问题?

谢谢,

【问题讨论】:

  • 您是否考虑将 val 转换为 upper ,然后将其与 upper 结果进行比较?因此,您将大写字母与大写字母进行比较,将返回所有结果...
  • 不,我想给出一些单词并获得包含所有这些单词的所有结果,这些单词以任何顺序且不区分大小写
  • 如果有3个字怎么办?

标签: python sql django postgresql


【解决方案1】:

你可以使用ilike:

EXISTS(
    SELECT
        1
    FROM
        { self.fieldvalue_db_view }
    WHERE
        entry_id = { self.db_table }.id
        AND { self.fieldvalue_db_view }.field_id = { field.id }
        AND { self.fieldvalue_db_view }.{ text_search_column } ILIKE %(pattern) s
)

当您检查行是否存在时,您也不需要返回所有列,而是传递一个更便宜的常量

【讨论】:

  • 我可以使用ILIKE和多个条件吗?
  • 我想输入一些单词并以任意顺序获取包含该单词的所有结果,并且不区分大小写
  • hmmmm... 使用 like 或 pattern 搜索并不容易,您可以寻找 full text search 代替。
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多