如何使用 jsonb_path_query 以文本形式获取 jsonb 对象的值

问题描述 投票:0回答:3

从 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;

或者有没有更聪明的方法来获得相同的答案?

json postgresql jsonb
3个回答
2
投票

从结果中提取字符串

jsonb
:

SELECT j ->> 0
FROM jsonb_path_query(request::jsonb, '$.requestId') AS j(j);

2
投票

您可以通过在 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
只被调用一次。


0
投票

多个结果(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
酒吧

单个结果(jsonb_path_query_first)

如果您只有一个结果,您也可以这样做

select jsonb_path_query_first('[{"x": "foobar"}]', '$.x')->>0 x

jsonb_path_query_first
返回一个jsonb,您可以使用
->>0
获取纯文本

© www.soinside.com 2019 - 2024. All rights reserved.