2010-06-13 206 views
4

我需要查询一些数据。这里是我构建的查询,但这对我来说并不合适。对于这个例子我使用AdventureWorks数据库。带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 

这不适合我。如何在同一CASETHEN中有多个条件条款?我该如何做这项工作?

回答

4

基于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

让我想知道为什么我只是通过使用CASE语句来尝试这样做。我想我可以用它来构建查询,因为我需要。感谢 – pavanred 2010-06-13 19:13:01

+0

It's基本上是:(!!!条件1和条件2和condition3和条件4) 条件1 或条件2 或状况3 或 没有问题=) – kamahl 2010-06-13 20:15:57

4

这不是剪切和粘贴。 CASE表达式必须返回一个值,并返回一个包含SQL的字符串(这在技术上是一个值,但类型错误)。这是你想写什么,我想:

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 

我也怀疑,这可能不是在某些方言的工作,但现在不能测试(甲骨文,我看着你),由于不有布尔人。

但是,由于@url不依赖于表值,所以为什么不做三个不同的查询,并根据您的参数选择要评估哪个?

+1

感谢Amadan。我正在使用SQL Server,并且此查询无法正常工作。它会引发语法错误。 CASE声明不能像我所假定的那样使用。我试过这个,因为有语法错误,我试图构造where子句作为一个字符串(正如我在前面发布的问题),但有一点想法,我可以做出它的错误,但我不知道如何改正它。 – pavanred 2010-06-13 19:08:32