2016-09-21 1 views
0

In einem T-SQL-WHERE-Klausel,CASE Umsetzung in WHERE-Klausel

ich die admit_date zwischen CI.start_date und CI.end_date sein will, wenn es ein CI.end_date ist. Wenn kein Enddatum vorhanden ist, dann will ich 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 

Dies wird nicht sein, arbeiten, da ich nicht in der Lage bin diesem Fall einen Teil eines Ausdrucks in der WHERE-Klausel zu machen und nicht der Ausdruck selbst.

Wie implementiere ich das?

Antwort

3

CASE gehört nicht in der WHERE Klausel. Es existiert, um Ihnen die Möglichkeit zu geben, boolesche Ausdrücke auszuwerten. In der WHERE-Klausel brauchen Sie es nicht, weil die Klausel selbst ein boolescher Ausdruck ist.

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); 

Oder:

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

Dies kann mit

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

durch die Art und Weise ersetzt werden.

+0

Ich hatte das Gefühl, dass COALESCE in solchen Situationen gut funktioniert, aber einen Zeiger brauchte. Bin dankbar. – 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)