Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wiele warunków w klauzuli WHERE

Możesz użyć czegoś takiego:

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)

Jeśli Param ma wartość 0, pierwszy warunek to 0=0 i pasuje do wszystkich wierszy, więc zwracane są wszystkie wiersze. Jeśli param wynosi 1 lub 2, tylko odpowiedni lub rozgałęzienie pasuje do pierwszego warunku, więc zwraca to, co określa drugi warunek.

Również option (recompile) jest naprawdę ważny (zobacz artykuł w komentarzu Martina). Instruuje serwer SQL, aby używał wartości parametrów wykonawczych podczas przygotowywania planu wykonania, więc w skrócie:

  • kiedy @Param =0 zapytanie staje się select * from @Accessories
  • kiedy @Param =1 zapytanie staje się select * from @Accessories where atype = 'HDD'
  • kiedy @Param =2 zapytanie staje się select * from @Accessories where atype != 'HDD'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dołączanie pliku MDF bez pliku LDF

  2. Zapytanie indeksujące dotyczące odbudowy serwera SQL

  3. Dlaczego Asp.net MVC4 nie może używać bez plików cookie przechowywania stanu sesji SQL Server?

  4. Używanie JDBC, gdy nazwa serwera zawiera ukośnik odwrotny (localhost\TESTDATA)

  5. Jak uzyskać wszystkie dzieci rodzica, a następnie ich dzieci za pomocą rekurencji w zapytaniu?