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

SQL tilføjer kun filter, hvis en variabel ikke er null

Du kan oversætte dit krav til :

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)

OPTION (RECOMPILE) er valgfrit, men kan give bedre udførelsesplaner på bekostning af ekstra kompileringstid som diskuteret i den kanoniske artikel om emnet Dynamiske søgebetingelser i T-SQL

Eller med COALESCE() for at undgå OR :

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

Bemærk: Som @jarlh sagde, hvis route_query er nullbar, kan dette forårsage nogle problemer på grund af nul-sammenligning, så du vil måske bruge den første forespørgsel.

En anden mulighed for dette er to separate forespørgsler, der bruger UNION ALL , en for hver betingelse -

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

Med hensyn til ydeevne er det kun den sidste, der vil bruge indekset, jeg tror, ​​at det første vil være det hurtigste, men det kan ændre sig afhængigt af indekserne, tabellernes størrelse ETC.



  1. SQL - Sådan omarrangeres en udvalgt forespørgsel, der bruger grænsebegrænsningen

  2. Skift eller indstil MySQL Long Query Time Value for log-langsomme-forespørgsler

  3. Hvordan opdeler jeg en afgrænset streng i SQL Server uden at oprette en funktion?

  4. Konfiguration af Service Broker til asynkron behandling