为了简单起见,我在 PostgreSQL 中有两个表 A 和 B,其结构完全相同:
{
id varchar2(32) unique,
data jsonb
}
是否可以编写查询,该查询将返回 A 中的所有行,其中特定的 B.data 是 A.data 的“子 json”?
用类似 SQL 的术语表达:
SELECT A.*
FROM A, B
WHERE B.id = ? AND B.data is sub-json of A.data
json1 是 json2 的子 json,意味着通过从 A 中删除一些键/值对可以获得 B。示例:
{
"key1":"value1",
"key3":"value3"
}
是
的子json{
"key1":"value1",
"key2":"value2",
"key3":"value3"
}
json-s 可以有更复杂的结构。
如果可能的话,与将这些 json-s 分解为行并进行关系表连接相比,性能如何?
<@ operator正是您所说的“是…的子json”的意思。
我还建议宁愿使用
join ... on
语法,而不是使用 where
子句的过时语法。
select a.*
from a
JOIN b ON b.data <@ a.data
where b.id = ?;
至于性能,您可以在 JSONB 字段上创建和使用 GIN 索引,这将使上述查询非常快。扁平化然后连接的方法不会给您带来切实的好处。
不相关,但在 PostgreSQL 中最好使用小写名称。