Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Várias condições na cláusula WHERE


Você poderia usar algo assim:
select * 
from @Accessories 
where (@Param = 0)
  or (@Param = 1 and atype = 'HDD') 
--or (@Param = 1 and itype = 1) , if itype and atype are connected
  or (@Param = 2 and atype != 'HDD')
option (recompile)

Se Param for 0, a primeira condição se tornará 0=0 e corresponde a todas as linhas, para que todas as linhas sejam retornadas. Se param for 1 ou 2, somente o respectivo ou branch corresponde na primeira condição, então ele retorna o que a segunda condição especifica.

Além disso, a opção option (recompile) é realmente importante (veja o artigo no comentário de Martin). Ele instrui o SQL Server a usar os valores de tempo de execução dos parâmetros ao preparar um plano de execução, basicamente:
  • quando @Param =0 a consulta se torna select * from @Accessories
  • quando @Param =1 a consulta se torna select * from @Accessories where atype = 'HDD'
  • quando @Param =2 a consulta se torna select * from @Accessories where atype != 'HDD'