2010-07-30 17 views
3

我正在使用Postgres。带索引的数据库中不区分大小写的搜索?

我在我的数据库中有一个Artices表,它有一个url url的url url。这些都是为了让我可以在网站上显示该表中的文章,因为它不是“example.com/23323”,而是“example.com/Funny_Thing_Happened_to_Me”。 这足以实现,然后随着文章数量的增长,我在表格中添加了一个指向url slugs的索引。

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

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

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

回答

7

使用functional index

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

如果你在8.4和可以安装的contrib模块,那么还请看citext类型。它抽象掉所有较低/ UPPER的东西,并且表现稍好。

+0

感谢这似乎是要走的路。唯一的问题是我不能直接创建索引,因为较低的(url)存在冲突,但除了修复数据之外,我看不到任何其他方法。 – 2010-07-30 21:24:20

+1

@williamjones:将此索引添加为目前非唯一的索引以获得性能优势。然后修复唯一性,创建一个新的唯一索引,然后删除旧的索引。 – rfusca 2010-07-30 21:25:47

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

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

或者这样,如果你想坚持走 “低()”:

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