如何在Postgres中构建引用列的jsonpath查询



这很好用:

jsonb_path_query(p.blah::jsonb, '$[*] ? (@.fruit == "banana") ') 

但是如果我想比较JSON";水果";属性转换为列中的值,我无法让Postgres解析它,就像这样:

jsonb_path_query(p.blah::jsonb, '$[*] ? (@.fruit == c.fruit) ') 

我很难理解像";语法错误,在jsonpath输入的末尾出现意外的IDENT_P";

所有JSONpath函数还接受一个附加的JSON参数,该参数包含可以在JSON路径表达式中引用的键/值对:

jsonb_path_query(jsonb_column, 
'$[*] ? (@.fruit == $fp)', 
jsonb_build_object('fp', c.fruit) )

使用format()构建第二个参数,例如:

with my_table (fruit, json_col) as (
values
('banana', '[{"fruit": "banana"}, {"fruit": "apple"}]'::jsonb),
('apple', '[{"fruit": "pear"}]'),
('plum', '[{"fruit": "pear"}, {"fruit": "plum"}]')
)
select 
fruit, 
jsonb_path_query(json_col, format('$[*] ? (@.fruit == "%s")', fruit)::jsonpath) 
from my_table;
fruit  |  jsonb_path_query
--------+---------------------
banana | {"fruit": "banana"}
plum   | {"fruit": "plum"}
(2 rows)

最新更新