Sie können Ihre Anforderung in :
übersetzenSELECT 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.