2010-06-13 5 views
4

J'ai besoin d'interroger certaines données. voici la requête que j'ai construite mais qui n'est pas très bien pour moi. Pour cet exemple, j'utilise la base de données AdventureWorks.Plusieurs conditions avec les instructions CASE

SELECT * FROM [Purchasing].[Vendor] WHERE PurchasingWebServiceURL LIKE 
case 
// In this case I need all rows to be returned if @url is '' or 'ALL' or NULL 
when (@url IS null OR @url = '' OR @url = 'ALL') then ('''%'' AND PurchasingWebServiceURL IS NULL') 
//I need all records which are blank here including nulls 
     when (@url = 'blank') then (''''' AND PurchasingWebServiceURL IS NULL') 
//n this condition I need all record which are not like a particular value 
     when (@url = 'fail') then ('''%'' AND PurchasingWebServiceURL NOT LIKE ''%treyresearch%''') 
//Else Match the records which are `LIKE` the input value 
     else '%' + @url + '%' 
    end 

Cela ne fonctionne pas pour moi. Comment puis-je avoir plusieurs clauses de condition dans le THEN du même CASE? Comment puis-je faire ce travail?

Répondre

4

Une autre façon basée sur Amadan:

SELECT * FROM [Purchasing].[Vendor] WHERE 

     ((@url IS null OR @url = '' OR @url = 'ALL') and PurchasingWebServiceURL LIKE '%') 
    or 

     (@url = 'blank' and PurchasingWebServiceURL = '') 
    or 
     (@url = 'fail' and PurchasingWebServiceURL NOT LIKE '%treyresearch%') 
    or((@url not in ('fail','blank','','ALL') and @url is not null and 
      PurchasingWebServiceUrl Like '%'[email protected]+'%') 
END 
+0

Je me demande pourquoi j'essayais de faire cela seulement en utilisant l'instruction CASE. Je suppose que je peux l'utiliser pour construire la requête comme j'ai besoin. grâce – pavanred

+0

C'est en fait: (!! condition1 et condition2 et condition3 et de l'état 4) condition 1 ou condition 2 ou condition 3 ou Pas de problème =) – kamahl

4

Ce n'est pas un copier-coller. L'expression CASE doit renvoyer une valeur et vous renvoyez une chaîne contenant SQL (qui est techniquement une valeur mais de type incorrect). Voici ce que vous vouliez écrire, je pense:

SELECT * FROM [Purchasing].[Vendor] WHERE 
CASE 
    WHEN @url IS null OR @url = '' OR @url = 'ALL' 
    THEN PurchasingWebServiceURL LIKE '%' 
    WHEN @url = 'blank' 
    THEN PurchasingWebServiceURL = '' 
    WHEN @url = 'fail' 
    THEN PurchasingWebServiceURL NOT LIKE '%treyresearch%' 
    ELSE PurchasingWebServiceURL = '%' + @url + '%' 
END 

Je pense aussi que cela pourrait ne pas fonctionner dans certains dialectes, mais ne peut pas tester maintenant (Oracle, je vous regarde), en raison de ne pas avoir des booléens.

Cependant, puisque @url ne dépend pas des valeurs de la table, pourquoi ne pas faire trois requêtes différentes, et choisir lequel évaluer en fonction de votre paramètre?

+1

Merci Amadan. J'utilise SQL Server et cette requête ne fonctionne pas bien. Il jette une erreur de syntaxe. L'instruction CASE ne peut pas être utilisée comme ceci je présume. J'avais essayé ceci et parce qu'il y avait une erreur de syntaxe, j'ai essayé de construire la clause where en tant que chaîne (comme je l'ai posté dans la question plus tôt), mais je réfléchis un peu et je ne sais pas comment Fais-le bien. – pavanred

Questions connexes