以下是搜索“amadeus”子字符串时可以获得的数据示例:
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)
但是我想用
ILIKE
替换LIKE
。所以我试着用小写字母索引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)
但是,正如你所看到的,结果不是我所期望的。。。
有人能解释一下原因吗?如果可能的话,我怎样才能达到预期的行为呢?
最佳答案
运行select时,需要对列使用lower()函数:SELECT entidade FROM gma WHERE lower(entidade) LIKE '%amadeus%';
但由于前面有通配符,查询无论如何都不会使用索引。所以没有必要创造一个