Você pode traduzir sua exigência em:
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)
A
OPTION (RECOMPILE)
é opcional, mas pode fornecer melhores planos de execução às custas de tempo de compilação extra, conforme discutido no artigo canônico sobre o tópico Condições de pesquisa dinâmica em T‑SQL
Ou com
COALESCE()
para evitar o OR
:WHERE route_ou = 2
AND COALESCE(@l_s_query,route_query) = route_query
AND lang_id = 1
Observação: Como @jarlh disse, se
route_query
é anulável, isso pode causar alguns problemas devido à comparação nula, portanto, convém usar a primeira consulta. Outra opção são duas consultas separadas usando
UNION ALL
, um para cada condição - SELECT .. FROM ..
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM ..
WHERE @l_s_query = route_query
Em termos de desempenho, apenas o último usará o índice, acredito que o primeiro será o mais rápido, mas pode mudar dependendo dos índices, tamanhos das tabelas etc.