有没有办法在join子句中执行If Then语句

问题描述

我有两个桌子,花费和预订,我想完全参加。由于表的性质(并非所有预订都具有支出,并且并非所有支出都具有booking_id,有时还分配了错误的booking_id),我想在join子句中执行条件语句。

select bk.booking_id,bk.company_id,bk.event_id,bk.total_amount_booked,sp.spend
from 
(select booking_id,company_id,event_id,booked_rate,total_amount_booked
from bookings) bk
full join
(select booking_id,normalized_spend,spend
from spend) sp
on (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
or (bk.company_id = sp.company_id and bk.event_id = sp.event_id);

基本上,如果booking_id匹配且标准化支出与booked_rate匹配,则以该条件加入。 如果没有,请加入company_id和event_id。

但是,执行此查询会返回

FULL JOIN is only supported with merge-joinable join conditions;

有更好的方法吗? 使用Redshift

解决方法

这有点痛苦,但是您可以模拟full和两个left joinsunion all的连接:

select bk.booking_id,bk.company_id,bk.event_id,bk.total_amount_booked,sp.spend
from bookings bk
left join spend sp
    on (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
    or (bk.company_id = sp.company_id and bk.event_id = sp.event_id)
union all
select bk.booking_id,sp.spend
from spend sp
left join bookings bk
    on (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
    or (bk.company_id = sp.company_id and bk.event_id = sp.event_id)
where bk.booking_id is null
,

也许使用CASE语句,例如

...ON CASE WHEN (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
          THEN (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
         WHEN (bk.company_id = sp.company_id and bk.event_id = sp.event_id) 
          THEN (bk.company_id = sp.company_id and bk.event_id = sp.event_id)
    END