Несколько условий с инструкциями CASE - PullRequest
4 голосов
/ 13 июня 2010

Мне нужно запросить некоторые данные.Вот запрос, который я построил, но который мне не подходит.В этом примере я использую базу данных 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 одного и того же CASE?Как я могу сделать эту работу?

Ответы [ 2 ]

5 голосов
/ 13 июня 2010

Это не вырезать и вставить.Выражение 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 не зависит от значений таблицы, почему бы не сделать три разных запроса и выбрать, какой из них оценивать на основе вашего параметра?

4 голосов
/ 13 июня 2010

Другой способ, основанный на амадане:

    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
...