U kunt uw behoefte vertalen 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)
De OPTION (RECOMPILE)
is optioneel, maar kan betere uitvoeringsplannen opleveren ten koste van extra compilatietijd, zoals besproken in het canonieke artikel over het onderwerp Dynamische zoekvoorwaarden in T‑SQL
Of met COALESCE()
om de OR
. te vermijden :
WHERE route_ou = 2
AND COALESCE(@l_s_query,route_query) = route_query
AND lang_id = 1
Opmerking: Zoals @jarlh zei, als route_query
is nullable, dit kan problemen veroorzaken vanwege null-vergelijking, dus misschien wilt u de eerste query gebruiken.
Een andere optie hiervan zijn twee afzonderlijke zoekopdrachten met behulp van UNION ALL
, één voor elke voorwaarde -
SELECT .. FROM ..
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM ..
WHERE @l_s_query = route_query
Wat de prestaties betreft, zal alleen de laatste de index gebruiken, ik geloof dat de eerste de snelste zal zijn, maar deze kan veranderen afhankelijk van de indexen, de grootte van de tabellen ETC..