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

Sql 有没有办法在join子句中执行If Then语句,sql,left-join,amazon-redshift,where-clause,full-outer-join,Sql,Left Join,Amazon Redshift,Where Clause,Full Outer Join,我有两张桌子,一张是消费桌,另一张是预订桌,我正试着在上面做一个完整的连接。由于表的性质(不是所有的预订都有花费,也不是所有的花费都有预订id,有时会分配错误的预订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, to

我有两张桌子,一张是消费桌,另一张是预订桌,我正试着在上面做一个完整的连接。由于表的性质(不是所有的预订都有花费,也不是所有的花费都有预订id,有时会分配错误的预订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, company_id, event_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);
基本上,如果预订id匹配,且标准化支出匹配预订费率,则在该条件下加入。 如果没有,请使用公司id和活动id加入

但是,执行此查询将返回

完全联接仅支持合并可联接联接条件

有更好的方法吗?
使用红移

这有点痛苦,但是您可以用两个
左连接和
联合所有连接来模拟
完整的
连接:

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, bk.company_id, bk.event_id, bk.total_amount_booked, 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

旁白-红移不会在PostgreSQL上运行。它是一个独特的DBMS,起源于早期的Postgres方言。DataGrip说我正在i686 pc linux gnu上运行PostgreSQL 8.0.2,由GCC(GCC)3.4.2 20041017(Red Hat 3.4.2-6.fc3)和Redshift 1.0.19097编译。我假设这是一个较旧版本的Postgres,但是有一些函数在红移时不能执行,而在PostgreSQL上可以执行。这会导致相同的“完全连接仅支持合并可连接连接条件”错误