从查询结果中获取 jsonb 字段名称
Getting jsonb field names from query result
我有两个 table 这样的:
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 查询创建实体化视图
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;
此 select 查询的问题是当我添加新属性时,我必须将其添加到 select 查询以创建最新的实体化视图。
有没有一种方法可以编写一个聚合表达式来动态获取属性,而无需所有这些硬编码的属性名称?
您可以在 SQL Fiddle 中尝试我的代码:http://sqlfiddle.com/#!17/c4150/4
您需要嵌套聚合。首先收集属性的所有值,然后将其聚合到 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
我有两个 table 这样的:
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 查询创建实体化视图
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;
此 select 查询的问题是当我添加新属性时,我必须将其添加到 select 查询以创建最新的实体化视图。
有没有一种方法可以编写一个聚合表达式来动态获取属性,而无需所有这些硬编码的属性名称?
您可以在 SQL Fiddle 中尝试我的代码:http://sqlfiddle.com/#!17/c4150/4
您需要嵌套聚合。首先收集属性的所有值,然后将其聚合到 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