json 如何将返回集合的函数移动到PostgreSQL的LATERAL FROM项中

kqqjbcuj  于 2023-02-26  发布在  PostgreSQL
关注(0)|答案(3)|浏览(260)

我试试这个

select created_at, 
sum((json_array_elements(shipping_lines::json) ->> 'price')::float) as shipping_price
from t1
group by 1

显示错误:
错误:聚合函数调用不能包含返回集合的函数调用第5行:sum(((json数组元素(航运行::json)-〉〉'价格')...^提示:可以将返回集合的函数移到LATERAL FROM项中。
如何使用Lateral From修复此问题?我阅读了this PsSQL docs,但并不真正了解Lateral函数

ovfsdjhp

ovfsdjhp1#

这将是:

select t1.created_at, sum((x.obj->>'price')::float)  as shipping_price
from t1
left join lateral jsonb_array_element(t1.shipping_lines::jsonb) as x(obj) on true 
group by 1

或者,您可以在横向连接本身中计算sum(),这样就不需要外部聚合(假设created_at在开始的表中是唯一的):

select t1.created_at, x.shipping_price
from t1
cross join lateral (
    select sum((x.obj->>'price')::float) as shipping_price
    from jsonb_array_elements(t1.shipping_lines::jsonb) as x(obj)
) x

注意,我稍微修改了查询,使用jsonb代替json:这种新的数据类型比json更灵活、更高效(即使它在这里不会产生真实的的差异,但只要有选择,它应该是首选)。

zf2sa74q

zf2sa74q2#

嗯,把逻辑移到from子句:

select created_at, sum( (j->>'price')::float) as shipping_price
from t1 left join lateral
     json_array_elements(shipping_lines::json) j
     on true
group by 1
rbpvctlc

rbpvctlc3#

一种选择是稍后使用公用表表达式执行此操作。
例如:

with cte1 as
(
select created_at, 
(json_array_elements(shipping_lines::json) ->> 'price')::float) as c1
from t1
)
select created_at, 
sum(c1) as shipping_price
from cte1
group by 1

非常类似于上面的答案,但更容易阅读海事组织。

相关问题