使用索引在数据库中进行不区分大小写的搜索?

时间:2010-07-30 20:56:54

标签: database postgresql search case-insensitive

我正在使用Postgres。

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

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

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

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

2 个答案:

答案 0 :(得分:7)

使用functional index

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

如果您使用的是8.4并且可以安装contrib模块,那么还要查看citext类型。它抽象出所有较低/ UPPER的东西,并且表现稍好一些。

答案 1 :(得分:1)

SELECT * FROM sometable WHERE textfield ILIKE 'value%';

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

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

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