以下是搜索“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%';
但由于前面有通配符,查询无论如何都不会使用索引。所以没有必要创造一个

10-06 03:03