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)
- 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 值转换为文本的小技巧。
如何 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)
- 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 值转换为文本的小技巧。