【问题标题】:Getting jsonb field names from query result从查询结果中获取 jsonb 字段名称
【发布时间】:2018-02-23 18:35:35
【问题描述】:

我有两张这样的表:

create table product (
    id serial primary key,
    name text
);

create table selectedattribute (
    id serial primary key,
    product integer references product,
    attribute text,
    val text
);

我正在使用这个选择查询创建一个物化视图

select product.name,
jsonb_build_object(
    'color', COALESCE(jsonb_agg(val) FILTER (WHERE attribute='color'), '[]'),
    'diameter', COALESCE(jsonb_agg(val) FILTER (WHERE attribute='diameter'), '[]')
)
from product
left join selectedattribute on product.id = selectedattribute.product
group by product.id;

这个选择查询的问题是当我添加一个新属性时,我必须将它添加到选择查询中才能创建一个最新的物化视图。

有没有办法编写一个聚合表达式来动态获取属性而无需所有这些硬编码的属性名称?

您可以在 SQL Fiddle 中尝试我的代码:http://sqlfiddle.com/#!17/c4150/4

【问题讨论】:

    标签: postgresql aggregate-functions postgresql-json


    【解决方案1】:

    您需要嵌套聚合。首先收集属性的所有值,然后将其聚合到 JSON 中:

    select id, name, jsonb_object_agg(attribute, vals)
    from (
      select p.id, p.name, a.attribute, jsonb_agg(a.val) vals
      from product p
        left join selectedattribute a on p.id = a.product
      group by p.id, a.attribute
    ) t
    group by id, name;
    

    更新的 SQLFiddle:http://sqlfiddle.com/#!17/c4150/5

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多