#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
, это выражение , а не утверждение .