sql >> データベース >  >> RDS >> PostgreSQL

データからjsonb配列とオブジェクトの配列を返すにはどうすればよいですか?

    最初の結合の結果はテキスト文字列ではなくJSONとして扱うため、 jsonb_each()を使用します。 jsonb_each_text()の代わりに :

    SELECT t.employee, json_object_agg(a.k, d.value) AS sales
    FROM   mytable t
    JOIN   LATERAL jsonb_each(t.data) a(k,v) ON a.k LIKE 'sales_%'
    JOIN   LATERAL jsonb_to_recordset(a.v) d(yr text, value float) ON d.yr = '2012'
    WHERE  t.employee = 'Jim'  -- works because employee is unique
    GROUP  BY 1;
    

    GROUP BY 1 GROUP BY t.employeeの省略形です。 。
    結果:

    employee | sales
    ---------+--------
    Jim      | '{ "sales_tv" : 40, "sales_radio" : 76 }'
    

    また、クエリを解きほぐして簡略化しました。

    json_object_agg() 名前と値のペアをJSONオブジェクトとして集約するのに役立ちます。オプションでjsonbにキャストします それが必要な場合-またはjsonb_object_agg()を使用します Postgres9.5以降で。

    明示的なJOINの使用 最も明白な場所に条件を付加するための構文。
    同じ 明示的なJOINなし 構文:

    SELECT t.employee, json_object_agg(a.k, d.value) AS sales
    FROM   mytable t
         , jsonb_each(t.data)      a(k,v) 
         , jsonb_to_recordset(a.v) d(yr text, value float)
    WHERE  t.employee = 'Jim'
    AND    a.k LIKE 'sales_%'
    AND    d.yr = '2012'
    GROUP  BY 1;
    


    1. SQLServerで「値をデータ型に変換するときに変換に失敗しました」を修正する方法

    2. PostgreSQLで配列を比較する方法

    3. 高速ローカルストレージを求めて

    4. 1つのSQLクエリで複数のカウントを取得するにはどうすればよいですか?