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'
我有一张 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'