sql >> Databasteknik >  >> RDS >> Sqlserver

SQL add filter endast om en variabel inte är null

Du kan översätta ditt krav till:

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) är valfritt men kan ge bättre utförandeplaner på bekostnad av extra sammanställningstid som diskuteras i den kanoniska artikeln om ämnet Dynamiska sökvillkor i T‑SQL

Eller med COALESCE() för att undvika OR :

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

Obs! Som @jarlh sa, om route_query är nullbar, kan detta orsaka vissa problem på grund av nolljämförelse, så du kanske vill använda den första frågan.

Ett annat alternativ för detta är två separata frågor som använder UNION ALL , en för varje villkor -

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

När det gäller prestanda kommer endast den sista att använda indexet, jag tror att det första kommer att vara det snabbaste, men det kan ändras beroende på index, tabellstorlekar ETC.



  1. IntelliJ IDEA autokomplettera SQL med små bokstäver

  2. Kör utlöser lagrade procedurer på SqlFiddle. Mysql

  3. Upprepa en sträng flera gånger i MySQL – REPEAT()

  4. Vad täcker index och täckta frågor i SQL Server?