【问题标题】:Case insensitive search in database with an index?使用索引在数据库中进行不区分大小写的搜索?
【发布时间】:2011-03-23 11:07:38
【问题描述】:

我正在使用 Postgres。

我的数据库中有一个 Artices 表,其中有一列 url 用于 url slugs。这样我就可以在网站上将该表格中的文章显示为“example.com/23323”而不是“example.com/Funny_Thing_Happened_to_Me”。 这很容易实现,然后随着文章数量的增加,我在 url slugs 上的表中添加了一个索引。

我已经意识到,虽然我希望能够在 url 中显示大写字母,但我希望它们在用户输入的内容方面不区分大小写,并且我希望在案例中强制 url 的唯一性不敏感的方式。

是否有一种直接的方法可以不区分大小写地基于文本列快速搜索,并以不区分大小写的方式强制唯一性?

我尝试使用类似 lower(url) = 的内容进行搜索,但这会导致 Postgres 决定根本不使用索引。

【问题讨论】:

    标签: database postgresql search case-insensitive


    【解决方案1】:
    SELECT * FROM sometable WHERE textfield ILIKE 'value%';
    

    这就是你要找的吗? “以不区分大小写的方式强制执行唯一性”是什么意思?

    或者如果你想坚持“lower()”的话:

    SELECT * FROM sometable WHERE UPPER(textfield) LIKE (UPPER('value') || '%');
    

    【讨论】:

      【解决方案2】:

      使用functional index

      CREATE UNIQUE INDEX ix_test1 on articles (lower(url));
      

      如果您使用的是 8.4 并且可以安装 contrib 模块,那么还请查看 citext 类型。它抽象出所有较低/较高的东西,性能略好。

      【讨论】:

      • 谢谢,这似乎是要走的路。唯一的问题是,由于较低(url)上存在冲突,我无法直接创建索引,但除了修复数据之外,我看不到任何解决方法。
      • @williamjones:暂时将索引添加为非唯一以获得性能优势。然后修复唯一性,创建一个新的唯一索引,并删除旧的。
      猜你喜欢
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2012-12-20
      • 2010-09-12
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      相关资源
      最近更新 更多