Możesz przetłumaczyć swoje wymagania na :
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)
jest opcjonalne, ale może zapewnić lepsze plany wykonania kosztem dodatkowego czasu kompilacji, jak omówiono w artykule kanonicznym na ten temat Dynamiczne warunki wyszukiwania w T‑SQL
Lub za pomocą COALESCE()
aby uniknąć OR
:
WHERE route_ou = 2
AND COALESCE(@l_s_query,route_query) = route_query
AND lang_id = 1
Uwaga: Jak powiedział @jarlh, jeśli route_query
jest dopuszczalna, może to powodować pewne problemy z powodu porównania wartości null, więc możesz użyć pierwszego zapytania.
Inną opcją są dwa oddzielne zapytania przy użyciu UNION ALL
, po jednym dla każdego warunku -
SELECT .. FROM ..
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM ..
WHERE @l_s_query = route_query
Jeśli chodzi o wydajność, tylko ostatni użyje indeksu, uważam, że pierwszy będzie najszybszy, ale może się to zmienić w zależności od indeksów, rozmiarów tabel itp.