Postgresql按列选择订单由生成

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

我在Postgre上选择了
查询,其中包含
,子查询作为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
中的表达式中使用别名。您必须使用另一层子查询才能使您的解决方案工作,但如果它可以很简单,为什么要使它复杂呢?