Можете да преведете вашето изискване на:
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
По отношение на производителността, само последният ще използва индекса, вярвам, че първият ще бъде най-бързият, но може да се промени в зависимост от индексите, размерите на таблиците И Т.Н..