PostgreSQL:查询 JSON 数组中的元素

knu*_*nub 7 sql postgresql json jsonb

我有一个如下所示的数据库表:

---------------------------------------
| id | json_array (jsonb)             |
---------------------------------------
|  1 | [{"a": 1}, {"a": 5}, {"a": 1}] |
|  2 | [{"a": 2}]                     |
|  3 | [{"a": 1}]                     |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想使用 PostgreSQL 的 JSON 查询功能来选择json_array数组中的某些子字典,例如字典 where "a": 1

输出应该是

------------------
| id | json_dict |
------------------
|  1 | {"a": 1}  |
|  1 | {"a": 1}  |
|  3 | {"a": 1}  |
------------------
Run Code Online (Sandbox Code Playgroud)

以下查询适用于每个数组中的第一个元素,但我想检查所有元素:

---------------------------------------
| id | json_array (jsonb)             |
---------------------------------------
|  1 | [{"a": 1}, {"a": 5}, {"a": 1}] |
|  2 | [{"a": 2}]                     |
|  3 | [{"a": 1}]                     |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)

小智 9

假设这是一个 JSONB 列,您可以将@>运算符与 json 对象一起使用:

select *
from my_table
where json_array @> '[{"a": 1}]';
Run Code Online (Sandbox Code Playgroud)

在线示例: https: //rextester.com/SACUDU51598

如果您希望所有对象都作为行,则需要取消数组的嵌套:

select t.id, e.obj
from data t
  cross join jsonb_array_elements(json_array) as e(obj)
where e.obj = '{"a": 1}'
Run Code Online (Sandbox Code Playgroud)

在线示例: https: //rextester.com/DLG27322


S-M*_*Man 5

演示:db<>小提琴

您可以使用 . 将数组元素扩展为每行一个元素jsonb_array_elements()。可以这样过滤:

SELECT
    id,
    elems.value
FROM
    mytable,
    jsonb_array_elements(data) elems
WHERE
    elems.value = '{"a":1}'
Run Code Online (Sandbox Code Playgroud)