sql >> Base de Datos >  >> RDS >> Sqlserver

SQL agrega filtro solo si una variable no es nula

Puede traducir su requerimiento a:

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)

La OPTION (RECOMPILE) es opcional pero puede brindar mejores planes de ejecución a expensas del tiempo de compilación adicional, como se analiza en el artículo canónico sobre el tema Condiciones de búsqueda dinámica en T‑SQL

O con COALESCE() para evitar el OR :

WHERE  route_ou = 2
AND   COALESCE(@l_s_query,route_query) = route_query 
AND   lang_id  = 1

Nota: Como dijo @jarlh, si route_query es anulable, esto puede causar algunos problemas debido a la comparación nula, por lo que es posible que desee utilizar la primera consulta.

Otra opción de esto son dos consultas separadas usando UNION ALL , uno para cada condición -

SELECT .. FROM .. 
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM .. 
WHERE @l_s_query = route_query

En términos de rendimiento, solo el último usará el índice, creo que el primero será el más rápido, pero puede cambiar según los índices, los tamaños de las tablas, ETC.