Du kan oversætte dit krav til :
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)
er valgfrit, men kan give bedre udførelsesplaner på bekostning af ekstra kompileringstid som diskuteret i den kanoniske artikel om emnet Dynamiske søgebetingelser i T-SQL
Eller med COALESCE()
for at undgå OR
:
WHERE route_ou = 2
AND COALESCE(@l_s_query,route_query) = route_query
AND lang_id = 1
Bemærk: Som @jarlh sagde, hvis route_query
er nullbar, kan dette forårsage nogle problemer på grund af nul-sammenligning, så du vil måske bruge den første forespørgsel.
En anden mulighed for dette er to separate forespørgsler, der bruger UNION ALL
, en for hver betingelse -
SELECT .. FROM ..
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM ..
WHERE @l_s_query = route_query
Med hensyn til ydeevne er det kun den sidste, der vil bruge indekset, jeg tror, at det første vil være det hurtigste, men det kan ændre sig afhængigt af indekserne, tabellernes størrelse ETC.