繁体   English   中英

在数组上使用 JSONField 进行 Postgres 查询

[英]Postgres query with JSONField on array

我是 Postgres 的新手,并尝试构建一个 SQL 查询,该查询可以从表table_b中检索数组[]中的键/值字典对,并在WHERE子句中使用它来查找匹配的tag_nametag_value返回object_uuid

table_b上的原始tags作为JSONField()存储在 Django -> Postgres 中,不确定在提取每个标签时如何在数组中工作。

问题:我们如何构建一个 SQL 查询可以遍历table_b.tags中的每个namevalue ,然后使用它来匹配table_a

表_a

标签名 标签值 object_uuid
富吧 咖啡 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeee
你好 世界 3dd98cb6-978c-44b0-92fd-403032a7cb1f
key_one 81bba637-4156-42b2-a2c0-ae5dd23ed695

表_b

ID object_uuid 标签
3 00000000-1111-2222-3333-444444444444
4 99999999-8888-7777-6666-555555555555
271 [{“name”:“foobar”,“value”:“coffee”},{“name”:“hello”,“value”:“world”}]

我想我带着这个


SELECT
    id,
    object_uuid,
    name,
    value
FROM table_b b,
     jsonb_to_recordset(b.tags) AS (name TEXT, value TEXT)
ID object_uuid 姓名 价值
271 富吧 咖啡
271 你好 世界

在使用标记名和值构建数组后,您可以使用@>运算符加入:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM