从 Postgresql 中的复杂 json 字段类型中提取一些值
Extract some value from complex json field type in Postgresql
我有 postgres table(比方说 my_table)包含 JSON 字段(比方说 json_field) 作为:
(1, {"data": [{"val_a":1, "b":"somevalue"}, {"val_a":2, "b":"othervalue"}, ...]}),
(2, {"data": [{"val_a":22, "b":"somevalue2"}, {"val_a":12, "b":"othervalue2"}, ...]}),
....
(n, {"data": [{"val_a":11, "b":"somevaluen"}, {"val_a":122, "b":"othervaluen"}, ...]})
我只想 return ARRAY - int[] of val_a 值。
我试过存储过程(plpgsql),如下:
declare
data_array json[];
vals float8[];
begin
SELECT json_field->'data' into data_array FROM my_table;
FOREACH i IN ARRAY data_array
vals := array_append(vals, i->'val_a')
-- nor array_append(vals, i->'val_a') works
END LOOP;
return vals;
end;
这给我语法错误:
array_append(vals, i->'val_a').
提取val_a的最佳方法是什么?
使用 PostgreSQL 12.6
使用 JSONPATH 表达式:
SELECT jsonb_path_query_array(json_field, '$.data[*].val_a') FROM my_table;
jsonb_path_query_array
------------------------
[1, 2]
(1 row)
从 PostgreSQL v12 开始可用。
我有 postgres table(比方说 my_table)包含 JSON 字段(比方说 json_field) 作为:
(1, {"data": [{"val_a":1, "b":"somevalue"}, {"val_a":2, "b":"othervalue"}, ...]}),
(2, {"data": [{"val_a":22, "b":"somevalue2"}, {"val_a":12, "b":"othervalue2"}, ...]}),
....
(n, {"data": [{"val_a":11, "b":"somevaluen"}, {"val_a":122, "b":"othervaluen"}, ...]})
我只想 return ARRAY - int[] of val_a 值。
我试过存储过程(plpgsql),如下:
declare
data_array json[];
vals float8[];
begin
SELECT json_field->'data' into data_array FROM my_table;
FOREACH i IN ARRAY data_array
vals := array_append(vals, i->'val_a')
-- nor array_append(vals, i->'val_a') works
END LOOP;
return vals;
end;
这给我语法错误:
array_append(vals, i->'val_a').
提取val_a的最佳方法是什么?
使用 PostgreSQL 12.6
使用 JSONPATH 表达式:
SELECT jsonb_path_query_array(json_field, '$.data[*].val_a') FROM my_table;
jsonb_path_query_array
------------------------
[1, 2]
(1 row)
从 PostgreSQL v12 开始可用。