2016-09-21 105 views
0

在T-SQL WHERE子句,在實施CASE WHERE子句

我想admit_dateCI.start_dateCI.end_date之間是否有CI.end_date。如果不是一個結束日期,然後我想admit_date>= CI.start_date

WHERE 1=1 
     AND CASE WHEN CI.end_date IS NULL 
       THEN CEV.admit_date >= CI.start_date 
       ELSE CEV.admit_date BETWEEN CI.start_date AND CI.end_date 
       END 

這是行不通的,因爲我不能讓這個CASE表達式的一部分WHERE子句,而不是表達自己英寸

我該如何實施?

回答

3

CASE不會在WHERE子句中的歸屬。它的存在讓你有機會評估布爾表達式。在WHERE子句中,你不需要它,因爲子句本身是一個布爾表達式。

WHERE (CI.end_date IS NULL AND CEV.admit_date >= CI.start_date) 
    OR (CI.end_date IS NOT NULL AND CEV.admit_date BETWEEN CI.start_date AND CI.end_date); 

或者:

WHERE CEV.admit_date >= CI.start_date) 
    AND (CEV.admit_date <= CI.end_date OR CI.end_date IS NULL); 

這可以用

WHERE CEV.admit_date BETWEEN CI.start_date AND COALESCE(CI.end_date, CEV.admit_date); 

的方式取代。

+0

我有一種感覺,在這種情況下,COALESCE確實很棒,但需要一個指針。欣賞它。 – AS91

0
WHERE (CI.end_date IS NULL AND CEV.admit_date >= CI.start_date) 
    OR (CEV.admit_date BETWEEN CI.start_date AND CI.end_date)