CASE语句的多个条件

时间:2010-06-13 07:53:31

标签: sql sql-server case where-clause

我需要查询一些数据。这是我构建的查询,但对我来说这不是很好。对于此示例,我使用的是AdventureWorks数据库。

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

这对我不起作用。如何在同一THEN的{​​{1}}中有多个where条件子句?我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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 :(得分: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 '%'+@ur+'%') 
END