在 postgresql 中,如何选择 jsonb 数组包含对象的行?

jus*_*tin 14 postgresql jsonb

我的数据库表是这样的(数据是 JSONB 列):

 id |                 data                 
----+--------------------------------------
  1 | {"tags": [{"name": "tag1"}, {"name": "tag2"}]}
  2 | {"tags": [{"name": "tag2"}]}
  3 | {"tags": [{"name": "tag3"}]}
  4 | {"tags": [{"name": "tag4"}]}
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询,该查询将返回data包含标签tag2或 的行tag3。因此应返回第 1、2 和 3 行。我一直在查看 postgresql JSONB 文档,但我不清楚如何查询这样的嵌套结构。我该如何编写 where 子句?

小智 17

jsonb_array_elements会损害性能。如果这是一个问题,您可以使用此查询代替

SELECT * FROM MyTable where 
    data @> '[{"name": "tag2"}]'::jsonb 
    or 
    data @> '[{"name": "tag3"}]'::jsonb;
Run Code Online (Sandbox Code Playgroud)


Hal*_*Ali 16

在未嵌套的 json 数组上使用带有过滤器的 where contains 将返回 id 为 1、2 和 3 的行

SELECT * 
FROM mytable
WHERE EXISTS (
    SELECT TRUE 
    FROM jsonb_array_elements(data->'tags') x 
    WHERE x->>'name' IN ('tag2', 'tag3')
)
Run Code Online (Sandbox Code Playgroud)