Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL aggiunge filtro solo se una variabile non è nulla

Puoi tradurre la tua richiesta in :

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) è facoltativo ma può fornire piani di esecuzione migliori a scapito del tempo di compilazione aggiuntivo, come discusso nell'articolo canonico sull'argomento Condizioni di ricerca dinamica in T‑SQL

Oppure con COALESCE() per evitare il OR :

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

Nota: Come ha detto @jarlh, se route_query è nullable, ciò potrebbe causare alcuni problemi a causa del confronto nullo, quindi potresti voler utilizzare la prima query.

Un'altra opzione sono due query separate che utilizzano UNION ALL , uno per ogni condizione -

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

In termini di performance, solo l'ultimo utilizzerà l'indice, credo che il primo sarà il più veloce, ma potrebbe cambiare a seconda degli indici, delle dimensioni delle tabelle ecc.