[英]Is it possible to get json values as list from array of json in Postgres?
我使用 Postgresql 10 並假設我有下表:
CREATE TABLE test_table(id int8 NOT NULL, data jsonb);
並插入了這樣的值:
insert into test_table(id, data)
values (1, '{"external": [{"internal_1": "value_1", "internal_2": "some_value"}]}'),
(2, '{"external": [{"internal_1": "value_2", "internal_2": "another_value"}]}'),
(3, '{"external": [{"internal_1": "value_1", "internal_2": "other_value"}]}');
畢竟表:
id| data |
--|-------------------------------------------------------------------------|
1 |{"external": [{"internal_1": "value_1", "internal_2": "some_value"}]} |
2 |{"external": [{"internal_1": "value_2", "internal_2": "another_value"}]} |
3 |{"external": [{"internal_1": "value_1", "internal_2": "other_value"}]} |
問題是我需要將所有內部值作為一個數組
我嘗試了以下查詢:
select data -> 'external'
from test_table;
結果是:
?column? |
-----------------------------------------------------------------|
[{"internal_1": "value_1", "internal_2": "some_value"}] |
[{"internal_1": "value_2", "internal_2": "another_value"}] |
[{"internal_1": "value_1", "internal_2": "other_value"}] |
但最后我需要將內部值作為每個表格行的文本數組。 像這樣的東西:
?column? |
-------------------------------|
[value_1, some_value] |
[value_2, another_value] |
[value_1, other_value] |
是否可以使用 postgres json 函數和運算符編寫這樣的查詢?
更新! 內部鍵的數量可能不同(internal_1,...,internal_n),我們事先不知道鍵的名稱(在我的情況下它們是:internal_1 和 internal_2)
以下查詢應該是您想要的:
select json_build_array(data#>>'{external,0, internal_1}', data#>>'{external,0, internal_2}')
from test_table;
The idea is to use the json_build_array
function to create an array and them you need to select each element that will be part of it, a convenient way to do it is by using the #>'{json_path}'
so you select the elements using json 路徑。
資料來源: https://www.postgresql.org/docs/10/functions-json.html
SQLFiddle 對其進行測試: http://sqlfiddle.com/#!17/5c4d2/19
一種方法是通過以顯式方式單獨深入每個鍵來拆分元素,然后使用jsonb_build_array()
function:
SELECT jsonb_build_array(
(data ->> 'external')::jsonb -> 0 ->> 'internal_1',
(data ->> 'external')::jsonb -> 0 ->> 'internal_2')
FROM test_table
或者更動態地(對於具有更多或更少內部鍵的情況) jsonb_each_text()
可以在 CROSS JOIN 查詢中使用以提取每個鍵,然后可以應用jsonb_agg()
在 arrays 中組合它們:
SELECT id,
jsonb_agg(js.value)
FROM test_table
CROSS JOIN jsonb_each_text( ((data ->> 'external')::jsonb -> 0)::jsonb) AS js
GROUP BY id
ORDER BY id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.