如何将 postgresql 中 jsonb_path_query 的结果聚合到数组中?

1 postgresql aggregate jsonb

我有一个包含两列的表,其中包含 ID 和 JSON 对象 (jsonb)。每个 json 对象都包含多个嵌套在对象内部的值(例如 url)。我可以使用 jsonb_path_query 使用 [*] 提取所有这些值,但它们以每行一个值的形式返回。如何以结果表与原始表具有相同行数的方式聚合返回值?

这是示例:

CREATE TABLE IF NOT EXISTS test (
  oid integer,
  object jsonb
  );

INSERT INTO test
VALUES 
    (1, '{"links": [
            {"title": "a", "url": "w"},
            {"title": "b", "url": "x"}
        ]}'),
    (2, '{"links": [
            {"title": "c", "url": "y"},
            {"title": "d", "url": "z"}
        ]}');

SELECT 
  oid,
  jsonb_path_query(object, '$.links[*].url')
FROM test;
Run Code Online (Sandbox Code Playgroud)

select 查询返回下表:

| oid | jsonb_path_query |
| --- | ---------------- |
|  1  |       w          |
|  1  |       x          |
|  2  |       y          |
|  2  |       z          |
Run Code Online (Sandbox Code Playgroud)

但是,我想得到这个:

| oid | jsonb_path_query |
| --- | ---------------- |
|  1  |      [w,x]       |
|  2  |      [y,z]       |
Run Code Online (Sandbox Code Playgroud)

小智 6

使用jsonb_path_query_array()- 它将所有匹配项作为 (JSON) 数组返回

SELECT oid,
       jsonb_path_query_array(object, '$.links[*].url')
FROM test;
Run Code Online (Sandbox Code Playgroud)
SELECT oid,
       jsonb_path_query_array(object, '$.links[*].url')
FROM test;
Run Code Online (Sandbox Code Playgroud)