Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL ajoute un filtre uniquement si une variable n'est pas nulle

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..