使用json_agg遇重复行,调试时出现json类型无相等运算符错误
问题解决:json类型无法用于GROUP BY及多余分组导致的错误
错误原因
PostgreSQL的json类型没有内置的相等比较运算符,因此不能直接将json类型字段放在GROUP BY子句中,这就是你触发could not identify an equality operator for type json错误的核心原因。
多余的GROUP BY操作
你的查询里,LATERAL子查询已经为每条product记录聚合出对应的product_options数组——每个product只会关联一行聚合后的结果,完全不需要额外执行GROUP BY分组操作。多余的分组不仅引发了类型错误,也是之前重复行问题的诱因之一。
修正后的SQL
SELECT p.id, p.shop_id, p.provider_id, p.name, p.status, c.product_options FROM product p LEFT JOIN LATERAL ( SELECT json_agg(json_build_object( 'id', po.id, 'p_id', po.p_id, 'name', po.name )) AS product_options FROM product_options po WHERE p.id = po.p_id ) c ON true
补充说明
如果后续确实需要对JSON类数据进行分组或比较,可以将json转换为jsonb类型(jsonb支持相等比较),示例如下:
SELECT p.id, p.shop_id, p.provider_id, p.name, p.status, c.product_options::jsonb AS product_options FROM product p LEFT JOIN LATERAL ( SELECT json_agg(json_build_object( 'id', po.id, 'p_id', po.p_id, 'name', po.name )) AS product_options FROM product_options po WHERE p.id = po.p_id ) c ON true -- 若需分组,此时可使用转换后的jsonb类型字段 -- GROUP BY p.id, c.product_options::jsonb
内容的提问来源于stack exchange,提问作者Jsjs
相关产品推荐
相关产品推荐

