2017-05-09 17 views
1

私は、jsonb列のIDを検索するクエリを持っています。配列には多数のIDが含まれています。PostgreSQL - jsonbキーを1つの列に返します

は、私はこの

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

そして、それは2と3を見つけしかし、どのように私はそれが見つけたものを返すことができるため、クエリが行を返します。この

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

ようなクエリのようなデータを持っていると言いますそれは自分の列です。その結果、テキストやJSON形式で2,3などの結果が返されます。

私はこの

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

を試みたが、それは私が検索した内容である2及び3の両方を含有するB列とABカラム各値2を有するもの、3と4と3列Iは、1行が欲しいを作成に。

これは可能ですか?

私が探している例の結果。最後の列に気づく。私はデモのために区切られた列としてそれを置く。それは私が使用できるどんな形式でもかまいません。

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

あなたはキー2と3だけを使ってjsonを表示したいと思っていますが、キー4を右に押していますか? –

+0

はい、私は検索するIDの配列を持っています。 jsonbフィールドにも4というキーが含まれていますが、この例では2と3のレコードがクエリで見つかったidsを知りたいだけです。 –

+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のその他の文書化されていない関数を見つけることができます。

例ペースト:あなたが呼び出しjsonb_exists_any機能を使用している

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) 

?|演算子。

関連する問題