2010-06-13 2 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 

Это не работает для меня. Как я могу иметь несколько условий, где условия в THEN того же CASE? Как я могу сделать эту работу?

ответ

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

+0

подмигнули в основном: (!! condition1 и condition2 и condition3 и условие 4) условие 1 или условие 2 или условие 3 или Нет проблем =) – kamahl

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 

Я также подозреваю, что это может не работать в некоторых диалектах, но не может проверить сейчас (Oracle, я смотрю на вас), из-за не с булевыми.

Однако, поскольку @url не зависит от значений таблицы, почему бы не сделать три разных запроса и выбрать, какие из них будут оцениваться на основе вашего параметра?

+1

Благодаря Amadan. Я использую SQL Server, и этот запрос не работает нормально. Он выдает синтаксическую ошибку. Выражение CASE нельзя использовать, как я полагаю. Я пробовал это и потому, что произошла синтаксическая ошибка, я попытался построить предложение where как строку (как я уже писал в вопросе ранее), но немного подумал, и я могу разобраться в этом, но я не уверен, как сделать это правильно. – pavanred