2011-02-14 60 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类型,这似乎是您想要的。