sql >> Databáze >  >> RDS >> Sqlserver

SQL přidat filtr pouze v případě, že proměnná není null

Svůj požadavek můžete přeložit do:

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) je volitelný, ale může poskytnout lepší plány provádění na úkor dodatečného času kompilace, jak je popsáno v kanonickém článku na téma Podmínky dynamického vyhledávání v T‑SQL

Nebo pomocí COALESCE() abyste se vyhnuli OR :

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

Poznámka: Jak řekl @jarlh, pokud route_query má nulovou hodnotu, může to způsobit určité problémy kvůli porovnání null, takže možná budete chtít použít první dotaz.

Další možností jsou dva samostatné dotazy pomocí UNION ALL , jeden pro každou podmínku -

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

Pokud jde o výkon, index bude používat pouze poslední, věřím, že první bude nejrychlejší, ale může se změnit v závislosti na indexech, velikostech tabulek atd..



  1. Jak funguje funkce CONCAT() v PostgreSQL

  2. Rekurzivní logika v PHP + MySQL

  3. MySQL - Ignorovat dotaz, pokud tabulka neexistuje

  4. Datový typ ENUM (Enumeration) v MySQL:12 nejdůležitějších faktů a užitečných tipů