sql >> Database teknologi >  >> RDS >> Sqlserver

hvis andet inden for CTE?

prøv:

;with CTE_AorB
(
    select * from table_A WHERE (condition true)
    union all
    select * from table_B WHERE NOT (condition true)
),
CTE_C as
(
   select * from CTE_AorB // processing is removed
)

Nøglen med en dynamisk søgebetingelse er at sikre, at et indeks bruges. Her er en meget omfattende artikel om, hvordan man håndterer dette emne:

Dynamiske søgebetingelser i T-SQL af Erland Sommarskog

den dækker alle problemer og metoder til at forsøge at skrive forespørgsler med flere valgfrie søgebetingelser. Denne vigtigste ting, du skal være bekymret for, er ikke duplikeringen af ​​kode, men brugen af ​​et indeks. Hvis din forespørgsel ikke bruger et indeks, vil den præforme dårligt. Der er flere teknikker, der kan bruges, som måske eller måske ikke gør det muligt at bruge et indeks.

her er indholdsfortegnelsen:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

hvis du er på den korrekte version af SQL Server 2008, er der en yderligere teknik, der kan bruges, se:Dynamiske søgebetingelser i T-SQL-version til SQL 2008 (SP1 CU5 og nyere)

Hvis du er på den rigtige udgivelse af SQL Server 2008, kan du bare tilføje OPTION (RECOMPILE) til forespørgslen, og den lokale variabels værdi ved kørsel bruges til optimeringerne.

Overvej dette, OPTION (RECOMPILE) vil tage denne kode (hvor intet indeks kan bruges med denne rod af OR s):

WHERE
    (@search1 IS NULL or [email protected])
    AND (@search2 IS NULL or [email protected])
    AND (@search3 IS NULL or [email protected])

og optimer det på kørselstidspunktet (forudsat at kun @Search2 blev sendt ind med en værdi):

WHERE
    [email protected]

og et indeks kan bruges (hvis du har et defineret på Kolonne2)



  1. NHibernate - indstilling af lang streng som en parameter for forespørgsel

  2. Vis landeflag efter IP

  3. Sqlalchemy:sekundær forholdsopdatering

  4. Installation af psycopg2 (postgresql) i virtualenv på Windows