2017-09-22 15 views
0

複合型JSONを複合型に変換しようとしています。ここに例がありますJSONからネストされた複合型を挿入してテーブルに挿入する方法

CREATE TYPE ty as(a int, b int[]); 

CREATE TABLE ta(ab ty[]); 

INSERT INTO ta(ab) values(ARRAY[ROW(1, ARRAY[1, 1])::ty, ROW(2, ARRAY[2, 2])::ty]); 

select * from ta; 
      ab     
----------------------------------- 
{"(1,\"{1,1}\")","(2,\"{2,2}\")"} 
(1 row) 

これは問題ありません。

これでJSON配列を最初に複合型に挿入して挿入することでJSON配列を挿入しようとしています。 PostgreSQL関数が奇妙なエラーを投げています。

INSERT INTO ta(ab) values (json_populate_recordset(null::ty[], '[{"a":3,"b":[3,33]},{"a":4,"b":[4,44]}]')); 
ERROR: first argument of json_populate_recordset must be a row type 

INSERT INTO ta(ab) values (json_populate_recordset(null::ty, '[{"a":3,"b":[3,33]},{"a":4,"b":[4,44]}]')); 
ERROR: column "ab" is of type ty[] but expression is of type ty 
LINE 1: INSERT INTO ta(ab) values (json_populate_recordset(null::ty,... 
           ^
HINT: You will need to rewrite or cast the expression. 

これは私が共有しているサンプルであり、実際のJSONは他のいくつかの機能から生成されています。ですから、私はJSONを修正して複合型としてテーブルに挿入する方法が必要です。本当に近い動作しますが、挿入され得ていないものである: -

INSERT INTO ta(ab) values (json_populate_recordset(null::ty, '[{"a":3,"b":"{3,33}"},{"a":4,"b":"{4,44}"}]')); 
ERROR: column "ab" is of type ty[] but expression is of type ty 
HINT: You will need to rewrite or cast the expression. 

私はPostgreSQLが好きなことをJSON互換の配列に配列を変換する必要がなく、型キャストの問題があるので、これはまだ動作しませんどのように注意してください。

だから、私は本当にここに二つの問題を解決したい: - すなわち同類をjson_populate_recordset互換性のあるJSON、複雑なJSONにJSONに変換する方法

  1. は、タイプ(私たちの場合はTY)にシリアライズ取得します。

  2. タイプのARRAYを変換して挿入しようとすると、型キャストの問題を解決する方法。

答えて

1

jsonb_to_recordset

insert into ta (ab) 
select 
    array_agg((
     a, 
     (select array_agg(e::int) from jsonb_array_elements_text(b) jae(e)) 
    )::ty) 
from jsonb_to_recordset(
    '[{"a":3,"b":[3,33]},{"a":4,"b":[4,44]}]' 
) as v(a int, b jsonb) 
+0

からタイプと集計おかげクロードオルドを構築します。それはそれを達成するのは非常に複雑でしたが、機能しました。 – geek

関連する問題