2017-04-20 82 views
0

我正在尋找一種方法來使用鍵數組從JSONB對象中採集值。這是我的JSON:選擇性地從JSONB列中採集基於數組的鍵和值

{ 
    "Foo1": 1, 
    "Foo2": 2, 
    "Foo3": 3, 
    "Foo3": 4 
} 

我有一個名爲「@Fields」的變量,它的類型是TEXT []。該數組包含我想從對象中摘取的鍵的名稱。 {'Foo1','Foo2'}。結果應該是:

{ 
    "Foo1": 1, 
    "Foo2": 2 
} 

我用JSONB_EXTRACT_PATH(「數據」 :: jsonb,「@Fields」),然而它似乎函數需要傳遞的路徑作爲單個參數而我想給它的陣列不知何故。下面是它在我的查詢中的外觀:

SELECT 
    "UserID", 
    (
    CASE 
     WHEN ARRAY_LENGTH("@Fields", 1) = 0 THEN "Data" 
     ELSE JSONB_EXTRACT_PATH("Data", "@Fields") 
    END 
) AS "Data" 
FROM 
    UserMeta 

我懷疑我必須使用JSON_EACH或類似的東西?

回答

2

您只能用- operator逐個刪除密鑰。對於一切,你需要一個子選擇,在那裏你提取每個鍵值對,它們進行過濾(這裏來你的邏輯;它可以是任何東西BTW),然後彙總值加在一起:

(select jsonb_object_agg(key, value) 
from jsonb_each(data) 
where key = any(keys_should_stay)) sub_select 

例如,在上下文中使用: http://rextester.com/OANQ93761

編輯:如果你想具體含義爲空數組(即保留所有的按鍵),使用此謂詞來代替:

where key = any(keys_should_stay) 
or  cardinality(keys_should_stay) = 0 
+0

真棒,謝謝! – ddibiase