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.