从 json 对象中,我可以获取 requestId 的值作为文本:
"request" ->> 'requestId'
with -> 我得到一个 json 部分
"request" -> 'requestId'
它如何与 jsonb_path_query() 一起使用来获取文本值?
jsonb_path_query(request :: jsonb, '$.requestId')
一个解决方案应该是:
select test1 ->> 0
from (
select jsonb_path_query(request :: jsonb, '$.journeys[*].costs.distance.value') test1,
jsonb_path_query(request :: jsonb, '$.journeys[*].costs.distance.unit') test2
from json_import ri
) foo;
或者有没有更聪明的方法来获得相同的答案?
从结果中提取字符串
jsonb
:
SELECT j ->> 0
FROM jsonb_path_query(request::jsonb, '$.requestId') AS j(j);
您可以通过在 JSON 路径表达式中选择“父”对象来简化查询:
select dist ->> 'value' as test1,
dist ->> 'cost' as test2
from (
select jsonb_path_query(request::jsonb, '$.journeys[*].costs.distance') as dist
from json_import ri
) foo;
甚至可能会更快一点,因为
jsonb_path_query
只被调用一次。
您可以使用
jsonb_path_query_array
代替 jsonb_path_query
。这将为您提供一个 jsonb 数组而不是 setof jsonb
。同样,您可以使用 setof text
转换为 jsonb_array_elements_text
。示例:
select jsonb_array_elements_text(jsonb_path_query_array('[{"x": "foo"}, {"x": "bar"}]', '$.x')) x
结果:
x |
---|
富 |
酒吧 |
如果您只有一个结果,您也可以这样做
select jsonb_path_query_first('[{"x": "foobar"}]', '$.x')->>0 x
jsonb_path_query_first
返回一个jsonb,您可以使用->>0
获取纯文本