2010-07-30 18 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') || '%');