web-dev-qa-db-ja.com

postgresでjson_populate_recordsetを使用してjsonを解析する方法

データベース行の1つにテキストとしてjsonを保存しています。 jsonデータは次のとおりです

[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},{"id":67273,"name":"16167.txt"},{"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]

これを解析するには、postgresqlメソッドを使用します

json_populate_recordset()

次のようなコマンドを投稿すると

select json_populate_recordset(null::json,'[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},{"id":67273,"name":"16167.txt"},{"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]') from anoop;

それは私に次のエラーを与えますjson_populate_recordsetの最初の引数は行タイプでなければなりません

注:from句の「anoop」はテーブル名です。

json_populate_recordsetメソッドを使用してこのjson文字列からデータを抽出する方法を誰かに提案できますか?.

メソッドのリファレンスを http://www.postgresql.org/docs/9.3/static/functions-json.html から取得しました

17
kenthewala

Pgsql関数に渡される最初の引数json_populate_recordset行タイプである必要があります。 json配列を使用して既存のテーブルanoopにデータを入力する場合は、次のようにテーブルanoopを行タイプとして渡すことができます。

insert into anoop
select * from json_populate_recordset(null::anoop, 
        '[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},
          {"id":67273,"name":"16167.txt"},
          {"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]');

ここで、nullは、渡されたjsonで設定されていないテーブル列に挿入するデフォルト値です。

既存のテーブルがない場合は、 行タイプを作成 jsonデータ(つまり、列名とそのタイプ)を保持し、次のように最初のパラメーターとして渡す必要がありますanoop_type

create TYPE anoop_type AS (id int, name varchar(100));
select * from json_populate_recordset(null :: anoop_type, 
        '[...]') --same as above
28
jediKnight

そのために新しいタイプを作成する必要はありません。

select * from json_populate_recordset(null::record,'[{"id_item":1,"id_menu":"34"},{"id_item":2,"id_menu":"35"}]')
 AS
 (
    id_item int
    , id_menu int
 )
4
Yarex