Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

sinon au sein de CTE ?

essayez :

;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
)

la clé avec une condition de recherche dynamique est de s'assurer qu'un index est utilisé, Voici un article très complet sur la façon de traiter ce sujet :

Conditions de recherche dynamiques dans T-SQL par Erland Sommarskog

il couvre tous les problèmes et méthodes d'essayer d'écrire des requêtes avec plusieurs conditions de recherche facultatives. La principale chose dont vous devez vous préoccuper n'est pas la duplication de code, mais l'utilisation d'un index. Si votre requête ne parvient pas à utiliser un index, elle se déroulera mal. Plusieurs techniques peuvent être utilisées, qui peuvent ou non permettre l'utilisation d'un index.

voici la table des matières :

  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

si vous utilisez la bonne version de SQL Server 2008, il existe une technique supplémentaire qui peut être utilisée, voir :Conditions de recherche dynamiques dans la version T-SQL pour SQL 2008 (SP1 CU5 et versions ultérieures)

Si vous êtes sur cette version appropriée de SQL Server 2008, vous pouvez simplement ajouter OPTION (RECOMPILE) à la requête et la valeur de la variable locale au moment de l'exécution est utilisée pour les optimisations.

Considérez ceci, OPTION (RECOMPILE) prendra ce code (où aucun index ne peut être utilisé avec ce gâchis de OR s):

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

et l'optimiser au moment de l'exécution pour qu'il soit (à condition que seul @Search2 ait été transmis avec une valeur) :

WHERE
    [email protected]

et un index peut être utilisé (si vous en avez un défini sur Column2)