Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL adiciona filtro somente se uma variável não for nula


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.