Vous pouvez traduire votre besoin en :
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)
L'OPTION (RECOMPILE)
est facultatif mais peut donner de meilleurs plans d'exécution au détriment du temps de compilation supplémentaire, comme indiqué dans l'article canonique sur le sujet Conditions de recherche dynamiques dans T‑SQL
Ou avec COALESCE()
pour éviter le OR
:
WHERE route_ou = 2
AND COALESCE(@l_s_query,route_query) = route_query
AND lang_id = 1
Remarque : Comme @jarlh l'a dit, si route_query
est nullable, cela peut entraîner des problèmes en raison de la comparaison nulle, vous pouvez donc utiliser la première requête.
Une autre option consiste à deux requêtes distinctes utilisant UNION ALL
, un pour chaque condition -
SELECT .. FROM ..
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM ..
WHERE @l_s_query = route_query
En termes de performances, seul le dernier utilisera l'index, je pense que le premier sera le plus rapide, mais cela peut changer en fonction des index, des tailles des tables, etc..