postgresql 如何从Postgres JSONB列中选择特定属性

ggazkfy8  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(144)

我将JSON存储在一个jsonb列中:

[
  {
    "ORDER_TYPE": "foo",
    "PAYMENT_TYPE": "VISA",
  }
]

我可以很好地进行查询,但是是否可以从结果集中选择json的特定部分(PAYMENT_TYPE)?

SELECT PAYMENT_TYPE 
FROM tools.orders 
WHERE responsejsonb::jsonb @> '[{"ORDER_TYPE":"foo"}]';

所需的输出“付款类型”:“签证”或“VISA”

afdcj2ne

afdcj2ne1#

首先平整JSONB阵列。

select j ->> 'PAYMENT_TYPE' as payment_type -- and other expressions?
from tools.orders
cross join lateral jsonb_array_elements(responsejsonb::jsonb) as l(j)
where j ->> 'ORDER_TYPE' = 'foo';

编辑

然而,如果responsejsonb数组只有一个元素(或者只有第一个元素重要),那么它就更简单了,你需要的表达式是responsejsonb::jsonb->0->>'PAYMENT_TYPE'

SELECT responsejsonb::jsonb->0->>'PAYMENT_TYPE'
FROM tools.orders 
WHERE responsejsonb::jsonb @> '[{"ORDER_TYPE":"foo"}]';
o2gm4chl

o2gm4chl2#

您可以使用JSON路径表达式:

SELECT jsonb_path_query_first(responsejsonb, '$[*] ? (@.ORDER_TYPE == "foo").PAYMENT_TYPE')
FROM tools.orders 
WHERE responsejsonb @> '[{"ORDER_TYPE":"foo"}]';

如果需要所有付款类型,请使用jsonb_path_query_array()
Online example
如果responsejsonb真的是用jsonb类型定义的,则向jsonb的强制转换是无用的。

相关问题