簡體   English   中英

將 Postgresql jsonb 對象與值中數組中的項目連接起來

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM