postgresql 使用 json 子元素

postgresql using json sub-element

如何 select 仅来自 postgresql 数据库的“A”命名值 table。

Id Column
1001 {"results":[{"name":"A","value":"7.8"}, {"name":"B","value":"0.5"}]}
1002 {"results":[{"name":"B","value":"5.4"}, {"name":"D","value":"4.5"}]}
1003 {"results":[{"name":"D","value":"4.8"}, {"name":"A","value":"6.7"}]}

结果应该是

ID Name Value
1001 A 7.8
1003 A 6.7

根据列类型,您可以使用 json_to_recordset(如果列类型为 json)或 jsonb_to_recordset(如果列类型为 jsonb)

Demo

  • JSONB样本
select
  t.id,
  x.name,
  x.value
from
  test t
  cross join jsonb_to_recordset(("column"::jsonb) -> 'results') as x(name text, value text)
where
  x.name = 'A'
  • JSON样本
select
  t.id,
  x.name,
  x.value
from
  test t
  cross join json_to_recordset(("column"::json) -> 'results') as x(name text, value text)
where
  x.name = 'A'

您可以使用 JSON 路径查询来访问这样的元素:

select id, 
       'A' as name
       jsonb_path_query_first("column", '$.results[*] ? (@.name == "A").value') #>> '{}' as value
from the_table;       

这假设 column(这是一个可怕的名字)被定义为 jsonb(它应该是)。如果不是,则需要施放它 "column"::jsonb

jsonb_path_query_first returns 一个 jsonb 值,并且没有直接的方法将其转换为正确的文本值(例如 ->> )。 #>> '{}' 是将标量 jsonb 值转换为文本的小技巧。