簡體   English   中英

是否可以從 Postgres 中的 json 數組中獲取 json 值作為列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM