Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Mehrere Bedingungen in WHERE-Klausel

Sie könnten so etwas verwenden:

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)

Wenn Param 0 ist, wird die erste Bedingung zu 0=0 und Übereinstimmungen für alle Zeilen, sodass alle Zeilen zurückgegeben werden. Wenn param 1 oder 2 ist, stimmt nur der entsprechende oder-Zweig mit der ersten Bedingung überein, sodass zurückgegeben wird, was die zweite Bedingung angibt.

Auch die option (recompile) ist wirklich wichtig (siehe Artikel in Martins Kommentar). Es weist SQL Server an, die Laufzeitwerte der Parameter beim Vorbereiten eines Ausführungsplans zu verwenden, also im Grunde:

  • Wenn @Param =0 ist, wird die Abfrage zu select * from @Accessories
  • Wenn @Param =1 ist, wird die Abfrage zu select * from @Accessories where atype = 'HDD'
  • Wenn @Param =2 ist, wird die Abfrage zu select * from @Accessories where atype != 'HDD'