从没有列名的 Postgres 行构建 JSON

Building JSON from Postgres rows without column names

我有一个 3 列的 PostgreSQL 9.4.4 tbl,其中 k:TEXT、UNIQUE、v:INT、t:TEXT.

k      v      t
----------------
k1     3      x
k6     5      x
k11    3      y
k3     2      z
k4     2      y
k7     1      x
..     .      .

我正在尝试分别自动生成 3 个 JSON 数组:

1. [{"k1":3},{"k6":5},{"k7":1}] (WHERE t=x)
2. [{"k11":3},{"k4":2}] (WHERE t=y)
3. [{"k3":2}] (WHERE t=z)

问题:

  1. 首先,

SELECT JSON_BUILD_OBJECT(k,v) FROM tbl

给我个人 json 元素 {"k1":3}、{"k6":5} 等。 我可以在我的应用程序中构建完整的 json 数组(在 Go 中),但它很笨拙。 如何获得完整的 [{"k1":3},{"k6":5},{"k7":1}]?

SELECT array_to_json(array_agg(row_to_json(tx))) FROM (SELECT k,v FROM tbl ) tx;

给我列名,我不想要: [{"k":"k1","v":3},{"k":"k6","v":5} 等。我需要 [{ "k1":3}、{"k6":5}等

  1. 此外,

SELECT JSON_BUILD_OBJECT(k,v) FROM tbl WHERE t=x;

错误,所以我无法过滤 t。我不想要 GROUP BY,我想分别生成 3 个不同的 json 数组,根据 WHERE t= 的值,在 3 个不同的通道上。 IOW,我不想要 [{"y":[{"k11":3},{"k4":2}], 等等

我是 Postgres 9.4 中 json ops 的新手,我想在数据库中正确完成 json 而不是在它之外进行字符串操作。我在这里忽略了什么?任何帮助将不胜感激。

with s (k,v,t) as ( values
    ('k1',3,'x'),
    ('k6',5,'x'),
    ('k11',3,'y'),
    ('k3',2,'z'),
    ('k4',2,'y'),
    ('k7',1,'x')
)
select t, array_to_json(array_agg(json_build_object(k,v)))
from s
where t = 'y'
group by t