Запрос Postgre с JSONField на массиве

Я новичок в Postgres, и пытаюсь построить SQL запрос, который может получить словарную пару ключ/значение в массиве [] из таблицы table_b и использовать ее в WHERE предложении для поиска совпадений tag_name и tag_value, возвращая object_uuid

Оригинальные tags на table_b хранились как JSONField() в Django -> Postgres и не уверен, как это будет работать в массиве при извлечении каждого из них.

Вопрос: Как построить SQL-запрос, который может обойти каждый name и value в table_b.tags, а затем использовать его для сопоставления с table_a?

table_a

tag_name tag_value object_uuid
foobar coffee aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
hello world 3dd98cb6-978c-44b0-92fd-403032a7cb1f
key_one 81bba637-4156-42b2-a2c0-ae5dd23ed695

table_b

id object_uuid tags
3 00000000-1111-2222-3333-444444444444
4 99999999-8888-7777-6666-555555555555
271 [{"name": "foobar", "value": "coffee"}, {"name": "hello", "value": "world"}]

Вы можете присоединиться с помощью оператора @> после построения массива с именем tagname и значением:

select b.id, b.object_uuid, a.tag_name, a.tag_value
from table_b b
  join table_a a on b.tags @> jsonb_build_array(jsonb_build_object('name', a.tag_name, 'value', a.tag_value));

Это предполагает, что table_b.tags является колонкой jsonb (что на самом деле так и должно быть). Если это не так, необходимо привести его к виду b.tags::jsonb

Вернуться на верх