postgresql jsonb 不区分大小写的查询

postgresql jsonb case insensitive query

我有一个 table 喜欢:

CREATE TABLE cityData
(
  item character varying,
  data jsonb
);

它包含类似

的值
ITEM        DATA
test1       [{"rank":"1", "city":"New York"},{"rank":"3", "city":"Sidney"}] 
test2       [{"rank":"2", "city":"NEW YORK"},{"rank":"4", "city":"New Delhi"}] 

我需要获取城市 'New York' 的不同 json 个对象的数量 我正在使用以下查询

SELECT  * FROM   cityData t
WHERE ( data @> '[{"city":"New York"}]')
and t.item ilike '%test%';

但是这个查询输出了 test1 行。我需要使查询不区分大小写,以便 data @> '[{"city":"New York"}]' 匹配 New YorkNEW YORK

where lower(data::text)::jsonb @> lower('[{"city":"New York"}]')::jsonb

对于 PostgreSQL 12+,可以使用 @? 运算符和 jsonpath query 进行不区分大小写的匹配。按照所讨论的示例,您的子句可能类似于:

where data @? '$[*].city like_regex "(?i)^NEW YORK$"'

如果不构建特定的不区分大小写的索引,这可以显着加快速度,而不是将 JSONB 转换为字符串并返回使用 lower()