2011-02-14 53 views
0

以下是數據「莫扎特傳」子搜索時,我可以得到的一個例子:Postgresql索引小寫(列)不能按預期工作?

db=# SELECT entidade FROM gma WHERE entidade ILIKE '%amadeus%'; 
      entidade 
--------------------------------- 
Hairdresser Amadeus 
Snack-Bar Amadeus 
Restaurant Amadeus 
Restaurant Amadeus 
Restaurant Amadeus 
Amadeus - Musical Instruments 
(6 rows) 

不過,我希望能夠通過LIKE更換ILIKE。於是,我就指數entidade只用小寫字母:

db=# CREATE INDEX idx_gma_entidade ON gma USING btree 
db-# (lower(entidade)); 
CREATE INDEX 

現在我期待用LIKE訪問相同的數據:

db=# SELECT entidade FROM gma WHERE entidade LIKE '%amadeus%'; 
entidade 
---------- 
(0 rows) 

但是,正如你所看到的,結果是不是我所期望的... 有人可以解釋爲什麼嗎?而且,如果可能的話,我怎樣才能達到預期的行爲?

回答

2

你需要運行你的選擇時,使用較低的()函數在列:

SELECT entidade FROM gma WHERE lower(entidade) LIKE '%amadeus%';

但因爲你在前面的通配符,查詢永遠不會無論如何使用索引。因此,有創造一個

+0

謝謝a_horse_with_no_name但是...請你也解釋一下在創建索引時允許表達式的意義是什麼?這些表達式是如何使用的?如果我運行`SELECT entidade FROM gma WHERE entidade LIKE'amadeus%'`我會使用小寫索引嗎? – acm 2011-02-14 13:58:57

2

你不能使用btree索引。在搜索字符串的開頭使用通配符會使索引無用。

使用全文搜索查看或觀看wildspeed

1

創建索引應該永遠不變的結果查詢,它僅僅是如何實現的沒有點。您必須指定ILIKE或諸如lower(column) LIKE '...'之類的結構,以便對文本列進行不區分大小寫的匹配。您可以使用citext contrib模塊創建一個默認情況下不區分大小寫的citext類型,這似乎是您想要的。