【问题标题】:Order by result of subquery in PostgreSQL在 PostgreSQL 中按子查询的结果排序
【发布时间】:2019-01-08 18:50:09
【问题描述】:

假设我有一张表Employees 与列idnamesalarymanager_id 另一个表fields 的列field 可以是Employees 表中的任何字段。

如何按fields 表中的行对员工进行排序? 例如:当fields包含值'salary', 'manager_id'时,员工将按salary排序,然后按manager_id排序。

我尝试了类似的方法,但没有成功:

SELECT * FROM employees ORDER BY (SELECT field FROM fields)

编辑:最初的问题是我目标的简化示例。 我希望员工按他们的超级经理 id 排序,然后按第二个超级经理 id...最后按他们的直接经理的 id。

给定员工(id、姓名、薪水、manager_id):
1 亚历克斯 1000 NULL
2 莫尔 2000 1
3 约翰 3000 NULL
4 克里斯 4000 1
5 迈克尔 5000 4
6 哑光 6000 2

查询结果为:
1 亚历克斯 1000 NULL
2 莫尔 2000 1
6 哑光 6000 2
4 克里斯 4000 1
5 迈克尔 5000 4
3 约翰 3000 NULL

【问题讨论】:

  • @semicolon 这是不正确的,你觉得这个连接应该是什么样子?表字段包含字段名称
  • 添加一些示例表数据和预期结果 - 作为格式化文本(不是图像)。
  • @Livius 问题已编辑发表评论。现在我明白了。
  • @semicolon 好的,这是一个活生生的问题 ;-)。 sitoNz - 问题很有趣,但你的设计好吗?我从来没有这样的问题,我想我们大多数人。将这些排序信息存储在表中的目的是什么?
  • 如果 PostgreSQL 中有任何功能可以将行转换为列(如 SQL Server 中),那么您可以使用它。

标签: sql postgresql


【解决方案1】:

您不能在单个查询中做到这一点。

首先您必须查询fields,然后使用正确的ORDER BY 子句构造一条SQL 语句并运行它。

提防 SQL 注入 - 使用 format 函数构造查询。

【讨论】:

    【解决方案2】:

    如果您能告诉我们它给您带来的错误,它可能会帮助我们帮助您

    我认为' 符号是造成问题的原因,所以就好像你在写:

    SELECT * FROM employees ORDER BY 'salary', 'parent_id'
    

    尝试使用Replace()将其替换为空白字符

    【讨论】:

    • 我试过 ORDER BY replace(original subquery, '''', '')。你是这个意思吗?当字段表中只有一行时,查询结果与没有 ORDER BY 子句的结果相同,而当多行时,错误是“作为表达式的子查询返回多行”
    【解决方案3】:

    有一种方法可以实现这一点。但我强烈建议改变你的设计。 为了支持这一点,您必须在Fields 表中添加SEQ 字段来决定Fields 表中字段的顺序。第一个字段有 SEQ 1,第二个 2 ...

    SELECT
        *
    FROM
        Employees E
    ORDER BY
        CASE 
        (SELECT
            F.NAME
        FROM
            Fields F ORDER BY F.SEQ LIMIT 1) 
        WHEN 'salary' THEN E.salary
        WHEN 'parent_id' THEN E.parent_id
        ELSE 0 END
    
        ,
        CASE 
        (SELECT
            F.NAME
        FROM
            Fields F ORDER BY F.SEQ LIMIT 1 OFFSET 1) 
        WHEN 'salary' THEN E.salary
        WHEN 'parent_id' THEN E.parent_id
        ELSE 0 END
    

    sql fiddle 上的示例进行演示。有两个表FieldsAFieldsB 使测试更容易,无需从表中删除字段和新记录以查看它是否有效。 http://sqlfiddle.com/#!15/64df6e/2/0

    【讨论】:

    • 问题是我必须更改我添加到员工表的每一列的查询,当有很多列时,查询会很大
    • 那么唯一的方法就是创建存储过程并动态构建你的sql postgresql.org/docs/current/static/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多