带CASE语句的多个条件
问题描述:
我需要查询一些数据。这里是我构建的查询,但这对我来说并不合适。对于这个例子我使用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
这不适合我。如何在同一CASE
的THEN
中有多个条件条款?我该如何做这项工作?
答
基于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
答
这不是剪切和粘贴。 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
让我想知道为什么我只是通过使用CASE语句来尝试这样做。我想我可以用它来构建查询,因为我需要。感谢 – pavanred 2010-06-13 19:13:01
It's基本上是:(!!!条件1和条件2和condition3和条件4) 条件1 或条件2 或状况3 或 没有问题=) – kamahl 2010-06-13 20:15:57