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