从PostgreSQL表中提取特定列作为JSON对象数组
问题:
您有一个包含多列的表,希望为每一行返回一个对象数组,其中两列根据另一列分组。但是,您会遇到一个问题,即结果在每个对象中包含一个额外的键。期望的输出是一个仅包含两列的对象数组,并按第三列分组。
PostgreSQL 10 解决方案:
对于PostgreSQL 10及以上版本,可以使用-
运算符从jsonb
对象中删除单个键(或PostgreSQL 10 中的键数组),然后再进行聚合。
<code class="language-sql">SELECT val2, jsonb_agg(to_jsonb(t.*) - '{id, val2}'::text[]) AS js_34 FROM tbl t GROUP BY val2;</code>
PostgreSQL 9.4 解决方案:
在PostgreSQL 9.4及以上版本中,您可以使用jsonb_build_object()
或json_build_object()
从交替的键和值创建JSON对象。
<code class="language-sql">SELECT val2, jsonb_agg(jsonb_build_object('val3', val3, 'val4', val4)) AS js_34 FROM tbl GROUP BY val2;</code>
PostgreSQL 9.3 解决方案:
对于PostgreSQL 9.3及以上版本,可以使用to_jsonb()
和ROW表达式来创建JSON对象。您也可以使用子查询代替ROW表达式。
<code class="language-sql">SELECT val2, jsonb_agg(to_jsonb((val3, val4))) AS js_34 FROM tbl GROUP BY val2; SELECT val2, jsonb_agg(to_jsonb((SELECT t FROM (SELECT val3, val4) t))) AS js_34 FROM tbl GROUP BY val2;</code>
以上解决方案将返回期望的结果:一个仅包含两列的对象数组,并按第三列分组。
以上是如何在 PostgreSQL 中提取特定列作为 JSON 对象数组?的详细内容。更多信息请关注PHP中文网其他相关文章!