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 York
和 NEW 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()
。
我有一个 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 York
和 NEW 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()
。