2017-08-28 6 views
0

私はpostgresバックエンドから使用するオブジェクトを構築しようとしています。問題のテーブルは次のようになります。非JSONBポストグルテーブルからネストされたJSONBとしてデータをロードする方法

本質的に列がField_Columnsの行列の行として機能するものがいくつかあります。 Field_Valuesは塗りつぶされたセルです。

Create Table Platform_User (
    serial id PRIMARY KEY 
) 

Create Table Things (
    serial id PRIMARY KEY, 
    INTEGER user_id REFERENCES Platform_User(id) 
) 

Create Table Field_Columns (
    serial id PRIMARY KEY, 
    TEXT name, 
) 

Create Table Field_Values (
    INTEGER field_column_id REFERENCES Field_Columns(id), 
    INTEGER thing_id REFERENCES Things(id) 
    TEXT content, 
    PRIMARY_KEY(field_column_id, thing_id) 
) 

私はこのようになりますJSONなどの単一の事のためだけField_Values、ロードしようとしていた場合、これは単純なことになります。

SELECT JSONB_OBJECT(
    ARRAY(
     SELECT name 
     FROM Field_Columns 
     ORDER BY Field_Columns.id 
    ), 
    ARRAY(
     SELECT Field_Values.content 
     FROM Fields_Columns 
     LEFT JOIN Field_Values ON Field_Values.field_column_id = Field_Columns.id 
      AND Field_Values.thing_id = Things.id 
     ORDER BY Field_Columns.id) 
    ) 
) 
FROM Things 
WHERE Thing.id = $1 

をしかし、私はJSONを構築したいと思います返されたときにこのように見えるオブジェクト。私はすべてのフィールドのオブジェクトを取得したい:ユーザーは、このようなこのクエリの外観を構築する

{ 
    14: 
     { 
      'first field':'asdf', 
      'other field':'' 
     } 
    25: 
     { 
      'first field':'qwer', 
      'other field':'dfgdsfg' 
     } 
    43: 
     { 
      'first field':'', 
      'other field':'' 
     } 
} 

私の努力を所有していることをもののためにField_Valuesオブジェクトを、私はJSONBオブジェクト機能の問題に実行していますよフィールドの値は、オブジェクト自体

SELECT (
    JSONB_OBJECT(
     ARRAY(SELECT Things.id::TEXT 
      FROM Things 
      WHERE Things.user_id = $2 
      ORDER BY Things.id 
     ), 

     ARRAY(SELECT JSONB_OBJECT(
      ARRAY(
       SELECT name 
       FROM Field_Columns 
       ORDER BY Field_Columns.id), 
      ARRAY(
       SELECT Field_Values.content 
       FROM Field_Columns 
       LEFT JOIN Field_Values ON Field_Values.field_column_Id = Field_Columns.id 
        AND Field_Values.thing_id = Things.id 
       ORDER BY Field_Columns.id) 
      ) 
      FROM Things 
      WHERE Things.user_id = $2 
      ORDER BY Things.id 
     ) 
    ) 
) AS thing_fields 

あるオブジェクトを構築したくない私が得る特定のエラーは、関数jsonb_objectである(テキスト[]、[] jsonb)は存在しません。このようなやり方は、豊富なテキストの変換とそのようなナンセンスを伴わないものですか?または、クエリでデータを並べ替える代わりに、代わりに自分のコードでデータを並べ替える必要があります。

答えて

0

あなたのDDLスクリプトが私はあなたのためにこれらを作成した文法的に間違っています:

create table platform_users (
    id int8 PRIMARY KEY 
); 
create table things (
    id int8 PRIMARY KEY, 
    user_id int8 REFERENCES platform_users(id) 
); 
create table field_columns (
    id int8 PRIMARY KEY, 
    name text 
); 
create table field_values (
    field_column_id int8 REFERENCES field_columns(id), 
    thing_id int8 REFERENCES things(id), 
    content text, 
    PRIMARY KEY(field_column_id, thing_id) 
); 

私はまた、デシベルを移入するためにいくつかのスクリプトを作成しました:

insert into platform_users(id) values (1); 
insert into platform_users(id) values (2); 
insert into platform_users(id) values (3); 
insert into platform_users(id) values (4); 
insert into platform_users(id) values (5); 

insert into things(id, user_id) values(1, 1); 
insert into things(id, user_id) values(2, 1); 
insert into things(id, user_id) values(3, 2); 
insert into things(id, user_id) values(4, 2); 

insert into field_columns(id, name) values(1, 'col1'); 

insert into field_columns(id, name) values(2, 'col2'); 

insert into field_values(field_column_id, thing_id, content) values(1, 1, 'thing1 val1'); 
insert into field_values(field_column_id, thing_id, content) values(2, 1, 'thing1 val2'); 
insert into field_values(field_column_id, thing_id, content) values(1, 2, 'thing2 val1'); 
insert into field_values(field_column_id, thing_id, content) values(2, 2, 'thing2 val2'); 

ようなスクリプトあなたが尋ねる次の時間を含めてくださいあなたのスクリプトが正しいことを確認してください。これにより、あなたの質問に答えるために必要な作業が減ります。

あなたはjsonb_object_agg

select 
    t.id, 
    jsonb_object_agg(fc.name, fv.content) 
from 
    things t inner join 
    field_values fv on fv.thing_id = t.id inner join 
    field_columns fc on fv.field_column_id = fc.id 
group by 1 

結果は次のように見ていると、キーと値のペアを集約することで、あなたのjsonb値を取得できます。

thing_id;jsonb_value 
1;"{"col1": "thing1 val1", "col2": "thing1 val2"}" 
2;"{"col1": "thing2 val1", "col2": "thing2 val2"}" 
関連する問題