在PostgreSQL中按子查询的结果排序

时间:2018-08-01 08:58:41

标签: sql postgresql

假设我有一个表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个Alex 1000 NULL
2 Mor 2000 1
3 John 3000 NULL
4克里斯4000 1
5迈克尔5000 4
6 Matt 6000 2

查询结果为:
1个Alex 1000 NULL
2 Mor 2000 1
6 Matt 6000 2
4克里斯4000 1
5迈克尔5000 4
3约翰3000 NULL

3 个答案:

答案 0 :(得分:0)

您无法在单个查询中做到这一点。

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

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

答案 1 :(得分:0)

如果您可以告诉我们该错误给您的信息,则可能会帮助我们帮助您

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

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

尝试使用Replace()

将其替换为空白字符

答案 2 :(得分:0)

有一种方法可以实现这一目标。但我强烈建议您更改设计。 为此,您必须在SEQ表中添加Fields字段,以确定Fields表中字段的顺序。第一个字段具有SEQ 1,第二个字段具有……

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小提琴上的

示例进行演示。有两个表FieldsAFieldsB使测试更加容易,而无需从表字段和新记录中删除以查看其是否正常工作。 http://sqlfiddle.com/#!15/64df6e/2/0