[英]Join Postgresql jsonb object with an item from an array in values
我的 postgresql 數據庫中有兩個要加入的表:
表 1) 平台:
ID (INT) | data (JSONB)
------------+---------------------------------------------------------
1 | {"identity": "1", "platformName": "Teradata" }
2 | {"identity": "2", "platformName": "MSSQL" }
表 2) 用戶:
ID (INT) | data (JSONB)
------------+-----------+---------------
12 | { "role": "developer", "identity": "12", "accessRights": {"platforms": ["1"]} }
13 | { "role": "admin", "identity": "13", "accessRights": {"platforms": ["1", "2"]}" }
我需要獲取平台列表以及有權訪問它們的用戶列表。 像這樣的東西:
Platform ID | data (JSONB)
------------+-----------+---------------
1 | [{"role": "developer", "identity": "12"}]
2 | [{"role": "developer", "identity": "12"}, {"role": "admin", "identity": "13"}]
我想也許這樣的事情會有所幫助:
SELECT p.id, u.id, u.role
FROM users u
INNER JOIN platforms p ON (u.data->>'accessRights'->'platforms')::text::int = p.id
GROUP BY p.id
但我不能讓它工作。 那么有沒有得到我需要的結果?
一個簡單的連接是不夠的,因為您需要為每個平台聚合來自users.data
JSON 的信息。
select p.id as platform_id, u.*
from platforms p
cross join lateral (
select jsonb_agg(u.data - 'accessRights') as data
from users u
where u.data -> 'accessRights' -> 'platforms' ? p.id::text
) as u
請注意,這僅適用,因為您將平台 ID 存儲為字符串,而不是 (JSON) 整數,因為?
運算符僅適用於字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.