sql—是否可以从postgres中的json数组中获取列表形式的json值?

qlzsbp2j  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(421)

我使用postgresql 10,并假设我有下表:

  1. CREATE TABLE test_table(id int8 NOT NULL, data jsonb);

并插入以下值:

  1. insert into test_table(id, data)
  2. values (1, '{"external": [{"internal_1": "value_1", "internal_2": "some_value"}]}'),
  3. (2, '{"external": [{"internal_1": "value_2", "internal_2": "another_value"}]}'),
  4. (3, '{"external": [{"internal_1": "value_1", "internal_2": "other_value"}]}');

毕竟这张table:

  1. id| data |
  2. --|-------------------------------------------------------------------------|
  3. 1 |{"external": [{"internal_1": "value_1", "internal_2": "some_value"}]} |
  4. 2 |{"external": [{"internal_1": "value_2", "internal_2": "another_value"}]} |
  5. 3 |{"external": [{"internal_1": "value_1", "internal_2": "other_value"}]} |

问题是我需要将所有内部值作为一个数组
我尝试了以下查询:

  1. select data -> 'external'
  2. from test_table;

结果是:

  1. ?column? |
  2. -----------------------------------------------------------------|
  3. [{"internal_1": "value_1", "internal_2": "some_value"}] |
  4. [{"internal_1": "value_2", "internal_2": "another_value"}] |
  5. [{"internal_1": "value_1", "internal_2": "other_value"}] |

但最后,我需要将内部值作为每个表行的文本数组。类似于:

  1. ?column? |
  2. -------------------------------|
  3. [value_1, some_value] |
  4. [value_2, another_value] |
  5. [value_1, other_value] |

是否可以使用postgresjson函数和操作符编写这样的查询?
升级!!内部密钥的数量可能不同(internal_1,…,internal_n),并且我们不预先知道密钥的名称(在我的示例中,它们是:internal_1和internal_2)

s8vozzvw

s8vozzvw1#

一种方法是通过以显式的方式深入每个键,然后使用 jsonb_build_array() 功能:

  1. SELECT jsonb_build_array(
  2. (data ->> 'external')::jsonb -> 0 ->> 'internal_1',
  3. (data ->> 'external')::jsonb -> 0 ->> 'internal_2')
  4. FROM test_table

或更动态地(对于具有更多或更少内部键的情况) jsonb_each_text() 可能在交叉联接查询中用于提取每个键,然后 jsonb_agg() 可以应用于在数组中组合它们:

  1. SELECT id,
  2. jsonb_agg(js.value)
  3. FROM test_table
  4. CROSS JOIN jsonb_each_text( ((data ->> 'external')::jsonb -> 0)::jsonb) AS js
  5. GROUP BY id
  6. ORDER BY id

演示

展开查看全部
xnifntxz

xnifntxz2#

以下查询应指向所需内容:

  1. select json_build_array(data#>>'{external,0, internal_1}', data#>>'{external,0, internal_2}')
  2. from test_table;

我们的想法是使用 json_build_array 函数来创建一个数组,您需要选择将成为其中一部分的每个元素,一种方便的方法是使用 #>'{json_path}' 因此,您可以使用json路径选择元素。
资料来源:https://www.postgresql.org/docs/10/functions-json.html
sqlfiddle来测试它:http://sqlfiddle.com/#!19年5月17日

相关问题