Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL филтър за добавяне само ако променливата не е нулева

Можете да преведете вашето изискване на:

SELECT  route_id [ROUTE_ID]
FROM route_master(NOLOCK)
WHERE  route_ou = 2
AND   (@l_s_query is null OR route_query = @l_s_query)
AND   lang_id  = 1
OPTION (RECOMPILE)

OPTION (RECOMPILE) не е задължително, но може да даде по-добри планове за изпълнение за сметка на допълнително време за компилиране, както е обсъдено в каноничната статия по темата Условия за динамично търсене в T‑SQL

Или с COALESCE() за да избегнете OR :

WHERE  route_ou = 2
AND   COALESCE(@l_s_query,route_query) = route_query 
AND   lang_id  = 1

Забележка: Както каза @jarlh, ако route_query е nullable, това може да причини някои проблеми поради null сравнение, така че може да искате да използвате първата заявка.

Друг вариант за това са две отделни заявки, използващи UNION ALL , по един за всяко условие -

SELECT .. FROM .. 
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM .. 
WHERE @l_s_query = route_query

По отношение на производителността, само последният ще използва индекса, вярвам, че първият ще бъде най-бързият, но може да се промени в зависимост от индексите, размерите на таблиците И Т.Н..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ISJSON() Примери в SQL Server (T-SQL)

  2. Съхранявайте файл в база данни на SQL Server, като използвате .Net MVC3 с Entity Framework

  3. Изпълнение на съхранена процедура с помощта на Windows Task Scheduler

  4. Грешка в заявката с двусмислено име на колона в SQL

  5. Използване на съхранена процедура в Entity Framework 5 със сложен тип?