Postgresql按列选择订单由生成
我在Postgre上选择了Postgresql按列选择订单由生成,postgresql,Postgresql,我在Postgre上选择了查询,其中包含,子查询作为json列。我需要使用子查询json数据或列根据对查询结果进行排序 这是我运行的一个示例查询: SELECT person.id, ( WITH person_warehouse AS ( SELECT count(warehouse.id) AS total_warehouse, sum((warehouse.detailinfo -> 'total_a
查询,其中包含,子查询作为json列。我需要使用子查询json数据或列根据对查询结果进行排序
这是我运行的一个示例查询:
SELECT
person.id,
( WITH person_warehouse AS (
SELECT count(warehouse.id) AS total_warehouse,
sum((warehouse.detailinfo -> 'total_area'::text)::numeric) AS total_area_storage
FROM warehouse
WHERE warehouse.owner_id = person.id
GROUP BY warehouse.owner_id
)
SELECT row_to_json(person_warehouse .*) AS json_tree
FROM person_warehouse) AS warehousedata,
FROM
person
ORDER BY warehousedata->>'total_warehouse' DESC
但warehousedata并不是一列,这是一种回报。如何根据子查询结果对select查询进行排序
谢谢您可以在ORDER BY
子句中引用别名,但不能在表达式中使用该别名。您必须重复SELECT
列表中的表达式
此查询以极其复杂的方式编写,可以编写得更简单:
SELECT person.id,
json_build_object(
'total_warehouse',
count(warehouse.id),
'total_area_storage',
sum((warehouse.detailinfo ->> 'total_area')::numeric)
) AS warehousedata
FROM person
LEFT JOIN warehouse
ON warehouse.owner_id = person.id
GROUP BY person_id
ORDER BY count(warehouse.id) DESC;
如果你真的想把
ORDER BY
子句作为一个字符串排序,那么就加入一个类型转换。我已经修复了答案,我在那里犯了一个严重的错误。嗯,如果我们想根据操作结果排序,基本上不能/不建议使用WITH operation。最后,加入是唯一的方法。感谢您对这个问题的见解。WITH
可以很好地使用。正如我所说,问题是您不能在orderby
中的表达式中使用别名。您必须使用另一层子查询才能使您的解决方案工作,但如果它可以很简单,为什么要使它复杂呢?