Du kan översätta ditt krav till:
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)
är valfritt men kan ge bättre utförandeplaner på bekostnad av extra sammanställningstid som diskuteras i den kanoniska artikeln om ämnet Dynamiska sökvillkor i T‑SQL
Eller med COALESCE()
för att undvika OR
:
WHERE route_ou = 2
AND COALESCE(@l_s_query,route_query) = route_query
AND lang_id = 1
Obs! Som @jarlh sa, om route_query
är nullbar, kan detta orsaka vissa problem på grund av nolljämförelse, så du kanske vill använda den första frågan.
Ett annat alternativ för detta är två separata frågor som använder UNION ALL
, en för varje villkor -
SELECT .. FROM ..
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM ..
WHERE @l_s_query = route_query
När det gäller prestanda kommer endast den sista att använda indexet, jag tror att det första kommer att vara det snabbaste, men det kan ändras beroende på index, tabellstorlekar ETC.