switch - SQL utiliza la instrucción CASE en la cláusula WHERE IN
select case sql ejemplos (6)
Me doy cuenta de que esto ha sido respondido, pero hay un pequeño problema con la solución aceptada. Devolverá falsos positivos. Fácil de arreglar:
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))
Los paréntesis no son necesarios (aunque quizás sean más fáciles de leer, por eso los incluí).
¿Es posible usar el caso en donde en la cláusula? Algo como esto:
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)
Este código proporciona el error: Sintaxis incorrecta cerca de '',''.
seleccione * de Tran_LibraryBooksTrans LBT left join Tran_LibraryIssuedBooks LIB ON case WHEN LBT.IssuedTo = ''SN'' Y LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID LUEGO 1 cuando LBT.IssuedTo = ''SM'' Y LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID LUEGO 1 CUANDO LBT. IssuedTo = ''BO'' AND LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1 ELSE 0 END
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
No, no puedes usar case
y case
así. Pero puedes hacer
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)
Por cierto, puedes reducir eso a
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)
desde or P.Status IN (1,3)
también le proporciona todos los registros de @Status=''published'' and P.Status IN (1,3)
tal vez puedas intentarlo de esta manera
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''
De esta forma, si @Status = ''publicado'', la consulta comprobará si P.Status está entre 1 o 3, devolverá TRUE o ''FALSE''. Esto se combinará con TRUE al final
Espero eso ayude.
Creo que puedes usar un enunciado de caso en una cláusula where, aquí es cómo lo hago:
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
)
Este método me ha funcionado una y otra vez. ¡intentalo!