2017-05-09 95 views
1

我有查詢在jsonb列中搜索id,數組可以包含很多id。PostgreSQL - 在一列中返回jsonb鍵

說我有這樣的

id | act | act_id |     from_ids       | object_ids  | post_date 
2 post  1 {"2":"1494308197","3":"1494308198","4":"1494308199"} {"items":["104564"]} 1494308197 

而且這樣

SELECT an.* 
FROM activity_network an 
WHERE an.from_ids ?| ARRAY['2','3']; 

查詢,因爲它發現2和3。但是,我怎麼能返回它所發現的查詢將返回的行數據在它自己的專欄中。這樣它就可以返回2,3個文本或json格式或類似的結果。

我嘗試這樣

SELECT an.*, jsonb_each_text(from_ids) b 
FROM activity_network an 
WHERE an.from_ids ?| ARRAY['2','3']; 

但是,以ab柱創建3行每一個具有值2,3和4。我想1行與含B柱既2和3,其是我搜索的內容上。

這可能嗎?

我正在尋找的示例結果。注意最後一列。我把它作爲列進行演示分隔。它可以是我可以使用的任何格式。

2 | post | 1 | {"2":"1494308197","3":"1494308198","4":"1494308199} | {"items":["104564"]} | 1494308197 | 2,3} 
+0

你想告訴你只有鍵2和3的JSON,省略鍵4 - 對嗎? –

+0

是的,所以例如我有一個我搜索的ID數組,這種情況是2和3, jsonb字段也包含4的密鑰。但我只想知道查詢找到的記錄在這個例子中是2和3. –

+0

@VaoTsun我添加了一個預期的結果示例。 –

回答

2

在這裏我爆炸/內爆它。相當醜陋的方式。

t=# with p as (
    with c as (
    select '{"2":"1494308197","3":"1494308198","4":"1494308199"}'::json j 
) 
    select json_object_keys(j),j->json_object_keys(j) v 
    from c 
) 
select concat('{',string_agg(concat('"',json_object_keys,'"',':',v)::text,','),'}')::json 
from p 
where json_object_keys::int = ANY (ARRAY [2,4]); 
       concat 
------------------------------------- 
{"2":"1494308197","4":"1494308199"} 
(1 row) 

Time: 0.348 ms 
0

功能jsonb_exists_all聽起來像你想要的。它要求數組中的所有元素都以對象中的頂級密鑰的形式存在。

您可以在psql中使用\df *jsonb*命令找到jsonb和其他未公開的函數。

例如貼:

test=# SELECT * from twj WHERE jsonb_exists_any(from_ids, ARRAY['2','3']); 
id | act |       from_ids       
----+------+----------------------------------------------------------- 
    1 | post | {"2": "1494308197"} 
    3 | post | {"2": "1494308197", "3": "1494308198", "4": "1494308199"} 
(2 rows) 

test=# SELECT * from twj WHERE jsonb_exists_all(from_ids, ARRAY['2','3']); 
id | act |       from_ids       
----+------+----------------------------------------------------------- 
    3 | post | {"2": "1494308197", "3": "1494308198", "4": "1494308199"} 
(1 row) 

?|運營商使用的是調用jsonb_exists_any功能。