Svůj požadavek můžete přeložit do:
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)
je volitelný, ale může poskytnout lepší plány provádění na úkor dodatečného času kompilace, jak je popsáno v kanonickém článku na téma Podmínky dynamického vyhledávání v T‑SQL
Nebo pomocí COALESCE()
abyste se vyhnuli OR
:
WHERE route_ou = 2
AND COALESCE(@l_s_query,route_query) = route_query
AND lang_id = 1
Poznámka: Jak řekl @jarlh, pokud route_query
má nulovou hodnotu, může to způsobit určité problémy kvůli porovnání null, takže možná budete chtít použít první dotaz.
Další možností jsou dva samostatné dotazy pomocí UNION ALL
, jeden pro každou podmínku -
SELECT .. FROM ..
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM ..
WHERE @l_s_query = route_query
Pokud jde o výkon, index bude používat pouze poslední, věřím, že první bude nejrychlejší, ale může se změnit v závislosti na indexech, velikostech tabulek atd..