w3schools switch stored hacer ejemplos cómo sql select switch-statement case where-in

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!