postgresql jsonb不区分大小写的查询

ran*_*jan 5 postgresql jsonb

我有一张桌子:

CREATE TABLE cityData
(
  item character varying,
  data jsonb
);
Run Code Online (Sandbox Code Playgroud)

它包含像

ITEM        DATA
test1       [{"rank":"1", "city":"New York"},{"rank":"3", "city":"Sidney"}] 
test2       [{"rank":"2", "city":"NEW YORK"},{"rank":"4", "city":"New Delhi"}] 
Run Code Online (Sandbox Code Playgroud)

我需要获取多个不同的json对象,其中city是'New York'我正在使用以下查询

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

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

Clo*_*eto 6

where lower(data::text)::jsonb @> lower('[{"city":"New York"}]')::jsonb
Run Code Online (Sandbox Code Playgroud)

  • 转换为文本然后再次转换为 jsonb 会有效吗? (2认同)

Ant*_*off 5

@?在 PostgreSQL 12+ 中,可以使用运算符和jsonpath查询来完成不区分大小写的匹配。按照相关示例,您的子句可能看起来类似于:

where data @? '$[*].city like_regex "(?i)^NEW YORK$"'
Run Code Online (Sandbox Code Playgroud)

与将 JSONB 转换为字符串然后返回使用lower().