[英]Postgres query with JSONField on array
我是 Postgres 的新手,并尝试构建一个 SQL 查询,该查询可以从表table_b
中检索数组[]
中的键/值字典对,并在WHERE
子句中使用它来查找匹配的tag_name
和tag_value
返回object_uuid
table_b
上的原始tags
作为JSONField()
存储在 Django -> Postgres 中,不确定在提取每个标签时如何在数组中工作。
问题:我们如何构建一个 SQL 查询可以遍历table_b.tags
中的每个name
和value
,然后使用它来匹配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.