postgresql 如何在SQL中做递归case语句?

mctunoxg  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(107)

我有下面的示例数据,我想按如下顺序添加列“sort_key”,如下所示:

employee_ID first_name  last_name   Supervisor_ID   sort_key
580         Vick    White           583               3
585         Jonathan Brown          580               4
465         Jordan  Mistry          585               5
627         Rogan   Jacob           465               6
628         Tad     Max             465               6
583         Logan   Fi              81                2
81          Fara    Jake            8                 1
8           Raj     Xhi             NULL              0

基本上,我想遵循这样的逻辑:每个员工的sort_key都应该是他们主管的sort_key + 1。因此,没有任何主管(即,最高级别)的员工将具有0 sort_key,然后下面的员工将相应地获得他们的sort_key。
我试图写case语句,但不明白在else子句中写什么:

Case
When supervisor_id = NULL then 0
Else
(...) + 1
End as sort_key

我如何才能达到预期的效果?

mec1mxoz

mec1mxoz1#

单靠一个案例陈述是不够的。
在Postgresql中,你需要的是一个递归的CTE(公共表表达式)。

WITH RECURSIVE sortedemployees(employee_ID, first_name, last_name, Supervisor_ID, sort_key) AS (
        SELECT e.employee_ID, e.first_name, e.last_name, e.Supervisor_ID, 0 sort_key
        FROM employees e
        WHERE e.Supervisor_ID IS NULL
      UNION ALL
        SELECT e.employee_ID, e.first_name, e.last_name, e.Supervisor_ID, s.sort_key + 1
        FROM employees e
        INNER JOIN sortedemployees s on e.Supervisor_ID = s.employee_ID
    )
    SELECT * FROM sortedemployees;

此示例类似于Postgresql文档中的“广度优先搜索”示例。

相关问题