2016-07-20 7 views
2

jsonbフィールドの配列(jsonオブジェクト 'choice_values')にアクセスしています。その内容をコンマ区切りのテキストフィールドに解析します。 jsonb_array_elements機能は、私は単一のフィールド内に含まれる配列値のカンマ区切りリストに変換したい「SETOFテキスト」を返すことjsonb_array_elementsの結果をコンマ区切りのリストとして返します

SELECT 
    jsonb_array_elements(doc -> 'form_values' -> '8189' -> 'choice_values') 
FROM 
    field_data.exports; 

ありがとうございます。

答えて

2

戻り値の設定(jsonb_array_elements_text()など)はSELECTリストで呼び出すことはできますが、集計関数では使用できません。

これは、この例のように参加横にしばしば、FROM句に設定返す関数を呼び出すことをお勧めです:

with the_data as (
    select '["alfa", "beta", "gamma"]'::jsonb as js 
    ) 

select string_agg(elem, ',') 
from 
    the_data, 
    jsonb_array_elements_text(js) elem; 

    string_agg  
----------------- 
alfa,beta,gamma 
(1 row)  

だからあなたのクエリは次のようになります。

select string_agg(elem, ',') 
from 
    field_data.exports, 
    jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') elem; 
1

サブ選択がjsonb_array_elements_textstring_agg aggregate functionを使用すると効果があるようです(PG 9.5でテスト済み)。 PostgreSQL 9.3のjsonb_array_elementsではなく、PostgreSQL 9.4で追加されたjsonb_array_elements_textの使用に注意してください。

with exports as (
    select $${"form_values": {"8189": {"choice_values": ["a","b","c"]}}}$$::jsonb as doc 
) 
SELECT 
    string_agg(values, ', ') 
FROM 
    exports, jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') values 
GROUP BY 
    exports.doc; 

出力:

'a, b, c'

またthis question and its answersを参照してください。

+1

はい私はその質問で、申し訳ありません。何らかの理由で、string_agg関数はjsonb_array_elements()の結果を "setof text"ではなく "jsonb"の型として見ます。ここにエラーがあります: "ErrorMessage:function string_agg(jsonb、text)が存在しません" – Joebocop

+0

私はあなたの質問にも何か見落としました。 'jsonb_array_elements_text'([PG 9.4で追加](https://www.postgresql.org/docs/9.4/static/functions-json.html))を使用して、' jsonb'ではなく 'setof text'を取得する必要があります。出力。 –

+0

何かの理由でPG 9.3を使用する必要がある場合は、私がリンクしている他の質問を参照してください。いくつかの回避策があります。 –

関連する問題