2015-01-08 41 views
6

私はこれをかなり検索し、依然として答えられません。私はPostgreSQLを使用しています。下の例では、列名は「セクション」、列タイプはjson []です。PostgreSQLのJson配列から要素を取得する方法

私の列は、データベースに次のようになります。

sections 
[{"name"  : "section1", 
    "attributes": [{"attrkey1": "value1", 
        "attrkey2": "value2"}, 

       {"attrkey3": "value3", 
        "attrkey4": "value4"}] 
}, 
{"name"  : "section2", 
    "attributes": [{"attrkey3": "value5", 
        "attrkey6": "value6"}, 

       {"attrkey1": "value7", 
        "attrkey8": "value8"}] 
}] 

それはJSON配列だと私は私の結果に「attrkey3」を取得したいです。 Jsonから特定のキーを取得するには、私はjson_extract_path_text(json_column, 'json_property')を使用しても問題ありません。しかし、私はjson []からいくつかの財産を得る方法がわかりません。

私が上記の例についてお話した場合、私の結果に表示されるプロパティ "attrkey2"の値を取得したいと思います。配列なので、通常とは異なる動作をする可能性があります。私の配列のすべての値は別の行として機能するので、サブクエリを書く必要があるかもしれませんが、それを行う方法はわかりません。

また、インデックスを静的に書き込むことはできず、特定のインデックスからjson要素のプロパティを取得することもできません。私のクエリは動的に生成されるので、json配列の中にいくつの要素があるかはわかりません。

私はいくつかの静的な例を見ましたが、私の場合はそれを実装する方法がわかりません。誰かがクエリでこれを行う方法を教えてもらえますか?

+0

'' json [] '(PostgreSQLの' json'値の配列)型の列、 'JSON'型の列(あなたの例のような)があるとは思いません。どうか明らかにしてください。 – pozs

答えて

8

私はあなたがjson[]json値のPostgreSQLの配列)を持ってわからないが、列、または(あなたの例のように)JSON配列のように見えるjson型指定された列を、型指定されました。

いずれの場合も、クエリを実行する前に配列を展開する必要があります。 json[]の場合、unnest(anyarray)を使用する必要があります。 json型指定されたカラム内のJSON配列の場合には、あなたはjson_array_elements(json)を使用する必要があります(とLATERALが参加する - 彼らは私の例で暗黙的):

select  t.id, 
      each_section ->> 'name' section_name, 
      each_attribute ->> 'attrkey3' attrkey3 
from  t 
cross join unnest(array_of_json) each_section 
cross join json_array_elements(each_section -> 'attributes') each_attribute 
where  (each_attribute -> 'attrkey3') is not null; 
-- use "where each_attribute ? 'attrkey3'" in case of jsonb 


select  t.id, 
      each_section ->> 'name' section_name, 
      each_attribute ->> 'attrkey3' attrkey3 
from  t 
cross join json_array_elements(json_array) each_section 
cross join json_array_elements(each_section -> 'attributes') each_attribute 
where  (each_attribute -> 'attrkey3') is not null; 

SQLFiddle

残念ながら、あなたが持つ任意のインデックスを使用することはできませんあなたのデータ。スキーマを修正する必要があります。

+0

完璧!それが私が望んだことです。 SQLFiddleのコードは完璧です。私の問題を解決していただきありがとうございます。 –

1

そしてまた、キー値のマップデータはarrayにあった場合:

select each_data -> 'value' as value3 
from t cross join jsonb_array_elements(t.sections -> 'attributes') each_attribute 
where each_attribute -> 'key' = '"attrkey3"' 

偉大な答えはまた、私の場合のための完全なソリューションを提供するので、私はこれを言及しています。ちなみに、jsonb型属性のjsonb_array ..メソッドについても気をつけてください。

関連する問題