WHERE 子句中的 CASE 语句,在 THEN 之后有进一步的条件

CASE statement in the WHERE clause, with further conditioning after THEN

我有一张 table 发票和一份与发票相关联的合同。但是,并非每张发票都与合同相关联。我想要 return 所有与在一个时间范围内(从 2021 年 3 月 1 日开始)的合同相关联的发票,以及根本没有任何合同相关联的发票。我相信这类似于:contract IS null OR CASE WHEN contract IS NOT NULL THEN (condition on timestamp),但我不知道怎么写。注意实际条件会在多个列上进行,所以我在WHERE子句的条件下寻找多个子条件的一般形式。

示例:

发票Table

InvoiceID ContractID
1 NULL
2 1
3 NULL
4 2
5 3
6 4

合同Table

ContractID Contract Start Timestamp
1 2021-01-01 00:00:00
2 2021-02-01 00:00:00
3 2021-03-02 00:00:00
4 2021-05-01 00:00:00

期望的结果

InvoiceID ContractID
1 NULL
2 1
3 NULL
4 2

也许这样一个简单的左连接可以帮助您进行过滤

select 
I.*
from Invoice I
left outer join Contract C -- left join gets even the NULL contractid invoices
on C.ContractID= I.ContractID
where 
  C.[Contract Start Timestamp] IS NULL
  OR C.[Contract Start Timestamp]< '2021-03-01'