这很好用:
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)