sql >> Database >  >> RDS >> Sqlserver

SQL-filter alleen toevoegen als een variabele niet null is

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..



  1. Hoe kan ik in Postgresql verifiëren dat JSON geldig is?

  2. Oracle 10g:gegevens extraheren (selecteren) uit XML (CLOB-type)

  3. Hoe wijzig ik de NAMEDATALEN-configuratie na het installeren van PostgreSQL 9.0?

  4. java.sql.SQLException:Geen bewerkingen toegestaan ​​nadat de verbinding is gesloten