首页 > 解决方案 > Postgres if else inside left join

问题描述

我有一个users包含这些列的表:

parent_type (string, can be either `ParentGroup` or `SubGroup`)
parent_id (int)

还有表格parent_groups以及sub_groups带有 id 和 name 列。sub_groups还有一个 parent_id 与parent_groups

我需要从users表中选择所有列并加入表'parent_groups',如下所示:

select users.* from users
if (users.parent_type === 'SubGroup') {
    left join sub_groups on users.parent_id = sub_groups.id
    left join parent_groups on sub_groups.parent_id = parent_groups.id
} else if users.parent_type === 'ParentGroup') {
    left join parent_groups on users.parent_id = parent_groups.id
}

标签: sqlpostgresql

解决方案


一般来说,可能有更好的方法来执行此操作,并且更改表结构也可能会有所帮助,但您可以使用UNION来执行此操作。您必须确保列匹配,但它看起来像这样:

select * 
from users
left join sub_groups on users.parent_id = sub_groups.id
left join parent_groups on sub_groups.parent_id = parent_groups.id
where users.parent_type === 'SubGroup'
    UNION
select * 
from users
left join parent_groups on users.parent_id = parent_groups.id
where users.parent_type === 'ParentGroup';

推荐阅读