2012-06-27 5 views
8

Ist es möglich, eine CASE-Anweisung innerhalb einer IN-Klausel zu verwenden?Verwendung der CASE-Anweisung in der IN-Klausel

Dies ist eine vereinfachte Version von dem, was ich habe richtig zu kompilieren zu bekommen versucht:

SELECT * FROM MyTable 
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13) 
ELSE (@StatusID) END) 

Dank!

Antwort

21

CASE gibt nur einen Skalarwert zurück. Sie können dies stattdessen tun. (Ich gehe davon aus, wie pro Ihr Beispiel, dass, wenn @StatusID = 99, ein StatusID Wert von 99 ist kein Spiel.)

select * 
from MyTable 
where (@StatusID = 99 and StatusID in (5, 11, 13)) 
    or (@StatusID <> 99 and StatusID = @StatusID) 
+1

@ LittleBobbyTables Mit deinem Namen, bin ich mir sicher, dass du das im Backend ändern kannst :) – RedFilter

+0

Danke! Tolle Lösung! – crjunk

3

Nr Stattdessen können Sie es ausdrückte außerhalb

SELECT * 
FROM MyTable 
WHERE 1 = (CASE WHEN @StatusID = 99 and StatusId in (5, 11, 13) then 1 
       WHEN coalesce(@StatusId, 0) <> 99 and StatusId in (@StatusID) then 1 
       ELSE 0 
      END) 

Sie können dies auch ohne die case-Anweisung schreiben.

Eine andere Option ist dynamisches SQL, bei dem Sie tatsächlich eine Zeichenfolge mit der SQL-Anweisung erstellen und dann ausführen. Dynamisches SQL scheint jedoch in diesem Fall übertrieben zu sein.

+1

Ich habe mich über diese Syntax gefragt, nachdem ich die Batch-Anweisung einer anderen Person gelesen habe, und jetzt weiß ich, warum sie verwendet wird. Toller Tipp, danke, @ Gordon-Linoff – Sung

0

Ich dachte, ich würde dies mit einem Table Valuue Constructor anders versuchen - sind TVCs im folgenden Kontext nicht erlaubt?

SELECT * 
FROM MyTable 
WHERE StatusID IN 
    ( 
    SELECT 
     CASE 
     WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID) 
     ELSE @StatusID 
    END 
    ) 
0

Sie können dies mit TVCs tun, aber der Ansatz ist ein wenig anders. Es verwendet nicht Fall, aber es wird mehr schön skalieren, wo es eine Reihe von möglichen Optionen zur Auswahl:

SELECT * 
FROM MyTable 
join (values 
     (99,5),(99,11),(99,13), 
     (@StatusID , @StatusID)  
    ) t(k,v) on t.k= @StatusID and t.v = StatusID) 

oder wenn Sie brauchen, um alles in der where-Klausel dann:

SELECT * 
FROM MyTable 
WHERE exists (
    select 1 
    from (values 
     (99,5),(99,11),(99,13), 
     (@StatusID , @StatusID)  
    ) t(k,v) 
    where t.k= @StatusID and t.v = StatusID) 
Verwandte Themen