Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Filter nur hinzufügen, wenn eine Variable nicht null ist

Sie können Ihre Anforderung in :

übersetzen
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)

Die OPTION (RECOMPILE) ist optional, kann aber auf Kosten zusätzlicher Kompilierungszeit bessere Ausführungspläne liefern, wie im kanonischen Artikel zum Thema Dynamische Suchbedingungen in T‑SQL

Oder mit COALESCE() um das OR zu vermeiden :

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

Hinweis: Wie @jarlh sagte, wenn route_query nullfähig ist, kann dies aufgrund des Nullvergleichs zu Problemen führen, daher sollten Sie die erste Abfrage verwenden.

Eine weitere Möglichkeit hierfür sind zwei getrennte Abfragen mit UNION ALL , eine für jede Bedingung -

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

In Bezug auf die Leistung wird nur der letzte den Index verwenden, ich glaube, der erste wird der schnellste sein, aber es kann sich je nach Index, Größe der Tabellen usw. ändern.