Как использовать функцию case в предложении SQL where?

#sql #sql-server #reporting-services

Вопрос:

Я преобразую отчет Crystal в SSRS. В разделе CR Выберите записи есть несколько фильтров, включая оператор IF, подобный этому:

 (if BeginCompany <> 0 and EndCompany <> 999 then
     Company between BeginCompany and EndCompany else 1 = 1)
 

Как я могу сделать эквивалентное утверждение CASE в предложении SQL WHERE в моем наборе данных? Спасибо.

Комментарии:

1. К вашему сведению case , это выражение , а не утверждение .

2. В соответствии с руководством по вопросам, пожалуйста, покажите, что вы пробовали, и расскажите нам, что вы нашли (на этом сайте или в другом месте) и почему это не соответствует вашим потребностям.

3. Итак, если BeginCompany-это «допустимое значение», а EndCompany-999, вы просто игнорируете и то, и другое?

Ответ №1:

Являются BeginCompany ли и EndCompany на самом деле переменными? Что это такое, когда вы не хотите использовать их в качестве фильтра? НОЛЬ? Что-то еще?

Может быть, вы ищете это (предполагая, что компании представлены целыми положительными числами):

 WHERE Company >= COALESCE(@BeginCompany, 0)
  AND Company <= COALESCE(@EndCompany, 2147483647)
 

Что является просто еще одним способом выразить:

 WHERE Company >= CASE 
      WHEN @BeginCompany IS NULL THEN 0 ELSE @BeginCompany END
  AND Company <= CASE
      WHEN @EndCompany IS NULL THEN 2147483647 ELSE @EndCompany END
 

Вы не можете использовать CASE выражение для управления потоком, например

 CASE ... something ... THEN Column BETWEEN x AND y
 

CASE это выражение, которое возвращает одно значение. Гораздо больше информации здесь:

Ответ №2:

Похоже, что логика хочет, чтобы поле Компании находилось между параметрами BeginCompany и EndCompany, если BeginCompany <> 0 и EndCompany <><> 999, чтобы показать запись, но если они равны 0 или 999, то покажите все записи. Если пользователь вводит 0 для параметра Begin или 999 для параметра end, то в запросе будут показаны все записи.

Я думаю, что в SQL это было бы

 WHERE   (
        @BeginCompany <> 0 
        and @EndCompany <> 999 
        AND Company between @BeginCompany and @EndCompany
        )
    OR  (
        @BeginCompany = 0 
        OR
        @EndCompany = 999
        )
 

Если вы действительно хотели сжать заявление по ДЕЛУ, если есть, то

 WHERE CASE WHEN 
                @BeginCompany <> 0 
                and @EndCompany <> 999 
                AND Company between @BeginCompany and @EndCompany
            THEN 1
            WHEN 
                @BeginCompany = 0 
                OR
                @EndCompany = 999
            THEN 1
            ELSE 0 END = 1
 

Комментарии:

1. К вашему сведению case , это выражение , а не утверждение .