2013-10-09 5 views
14

Ist es möglich zu verwenden Fall in wo in Klausel? Etwas wie folgt aus:SQL Verwendung CASE-Anweisung in WHERE IN-Klausel

DECLARE @Status VARCHAR(50); 
SET @Status='published'; 

SELECT * FROM Product P  
WHERE P.Status IN (CASE WHEN @Status='published' THEN (1,3) 
            WHEN @Status='standby' THEN (2,5,9,6) 
            WHEN @Status='deleted' THEN (4,5,8,10) 
            ELSE (1,3) 
            END) 

Dieser Code gibt den Fehler: falsche Syntax nahe ''.

+0

was ist der Typ von P.Status? –

+0

Sie können 'case' in' where' verwenden, aber nicht so. 'Case' muss einen Wert pro Anweisung zurückgeben. –

+0

@MaryamArshi: der Typ von P.Status ist int. – POIR

Antwort

20

Nein, Sie können case und in nicht so verwenden. Aber Sie können

SELECT * FROM Product P  
WHERE @Status='published' and P.Status IN (1,3) 
or @Status='standby' and P.Status IN (2,5,9,6) 
or @Status='deleted' and P.Status IN (4,5,8,10) 
or P.Status IN (1,3) 
tun

BTW können Sie, dass reduzieren

SELECT * FROM Product P  
WHERE @Status='standby' and P.Status IN (2,5,9,6) 
or @Status='deleted' and P.Status IN (4,5,8,10) 
or P.Status IN (1,3) 

seit or P.Status IN (1,3) Sie gibt auch alle Datensätze von @Status='published' and P.Status IN (1,3)

+2

Brauchen Sie keine Klammern um jede "oder" -Klausel? Z.B. oder (@ Status = 'Standby' und P.Status IN (2,5,9,6)) – dcp

+4

Denke nicht, dass du Klammern brauchst, aber die letzte 'oder' Anweisung wird falsche Ergebnisse liefern ...Sehen Sie diese Geige - der zweite Datensatz sollte nicht zurückgegeben werden. http://sqlfiddle.com/#!3/9aef0/6 – sgeddes

9

merke ich, diese beantwortet wurde, aber es gibt ein kleines Problem mit der akzeptierten Lösung. Es wird falsche Positive zurückgeben. Einfach zu beheben:

SELECT * FROM Products P  
WHERE (@Status='published' and P.Status IN (1,3)) 
    or (@Status='standby' and P.Status IN (2,5,9,6)) 
    or (@Status='deleted' and P.Status IN (4,5,8,10)) 
    or (@Status not in ('published','standby','deleted') and P.Status IN (1,2)) 

Klammerung nicht benötigt werden (wenn auch vielleicht einfacher damit lesen, warum ich sie enthalten).

1
select * from Tran_LibraryBooksTrans LBT left join 
Tran_LibraryIssuedBooks LIB ON case WHEN LBT.IssuedTo='SN' AND 
LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 when LBT.IssuedTo='SM' 
AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 WHEN 
LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 
ELSE 0 END`enter code here`select * from Tran_LibraryBooksTrans LBT 
left join Tran_LibraryIssuedBooks LIB ON case WHEN LBT.IssuedTo='SN' 
AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 when 
LBT.IssuedTo='SM' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 
WHEN LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 
1 ELSE 0 END 
1

select * from Tran_LibraryBooksTrans LBT Tran_LibraryIssuedBooks LIB ON Fall kommen gelassen, wenn LBT.IssuedTo = 'SN' AND LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1, wenn LBT.IssuedTo = 'SM' UND LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1, wenn LBT.IssuedTo = 'BO' AND LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1 ELSE 0 END

1

vielleicht können Sie auf diese Weise versuchen

SELECT * FROM Product P WHERE (CASE WHEN @Status = 'published' THEN (CASE WHEN P.Status IN (1, 3) THEN 'TRUE' ELSE FALSE END) WHEN @Status = 'standby' THEN (CASE WHEN P.Status IN (2, 5, 9, 6) THEN 'TRUE' ELSE 'FALSE' END) WHEN @Status = 'deleted' THEN (CASE WHEN P.Status IN (4, 5, 8, 10) THEN 'TRUE' ELSE 'FALSE' END) ELSE (CASE WHEN P.Status IN (1, 3) THEN 'TRUE' ELSE 'FALSE' END) END) = 'TRUE'

Auf diese Weise, wenn @Status = 'veröffentlicht', wird die Abfrage überprüfen, ob P.Status unter 1 oder 3 ist, wird es TRUE sonst zurückkehren 'false'. Dies wird mit TRUE am Ende

übereinstimmen. Hoffe es hilft.

1

Ich glaube Sie eine Case-Anweisung in einer where-Klausel verwenden können, ist hier, wie ich es tun:

Select 
ProductID 
OrderNo, 
OrderType, 
OrderLineNo 
From Order_Detail 
Where ProductID in (
Select Case when (@Varibale1 != '') 
then (Select ProductID from Product P Where .......) 
Else (Select ProductID from Product) 
End as ProductID 
) 

Diese Methode ist für mich immer wieder gearbeitet hat. Versuch es!