Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 case в выражении where (ошибка на знак сравнения)  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
Просьба подсказать в чем ошибка.

Сейчас есть 15 запросов, объединенных union-ом. Отличаются они только формулой расчета значения в зависимости от используемой формулы. (какую именно формулу использовать определяю по id формулы).
Решил переписать этот громадный union используя case. В предложении select - проблем не возникло, а вот в предложении where, где в зависимости от формулы выполняются различные проверочные неравенства - получаю ошибку.

Вот набросал для примера тестовый скрипт:

select  
   case when EmployeeID = 5 then 
             (1 - ShipVia/Freight)*100 
        when EmployeeID = 4 then 
             (2 - ShipVia/Freight)*100 
   end as Raschet,
  EmployeeID 
from orders
where case 
    when EmployeeID = 5 then 
             (ShipVia/Freight < 1)
    when EmployeeID = 4 then 
             (ShipVia/Freight < 2)
    end 


Получаю ошибку:

автор
Line 11: Incorrect syntax near '<'.


Как можно решить данную проблему и можно ли вообще при помощи case. Может имеет смысл сразу же посмотреть в сторону динамического формирования запроса?
11 июл 12, 11:51    [12849493]     Ответить | Цитировать Сообщить модератору
 Re: case в выражении where (ошибка на знак сравнения)  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Потому что case функция. Надо так:
where ShipVia/Freight < case 
    when EmployeeID = 5 then 1
    when EmployeeID = 4 then 2
    end 
11 июл 12, 11:57    [12849550]     Ответить | Цитировать Сообщить модератору
 Re: case в выражении where (ошибка на знак сравнения)  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
invm
Потому что case функция. Надо так:
where ShipVia/Freight < case 
    when EmployeeID = 5 then 1
    when EmployeeID = 4 then 2
    end 


Тогда я не совсем корректно привел пример.
Проблема в том, что при разных значениях EmployeeID - меняется и сама формула расчета (типа такого):

select  
   case when EmployeeID = 5 then 
             (1 - ShipVia/Freight)*100 
        when EmployeeID = 4 then 
             (2 - ShipVia/Freight)*100 
   end as Raschet,
  EmployeeID 
from orders
where case 
    when EmployeeID = 5 then 
             (ShipVia/Freight < 1)
    when EmployeeID = 4 then 
             (ShipVia/Freight*Freight/1213 < 2)
    end 
11 июл 12, 12:01    [12849592]     Ответить | Цитировать Сообщить модератору
 Re: case в выражении where (ошибка на знак сравнения)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Virtuoz
Тогда я не совсем корректно привел пример.
Проблема в том, что при разных значениях EmployeeID - меняется и сама формула расчета (типа такого):

select  
   case when EmployeeID = 5 then 
             (1 - ShipVia/Freight)*100 
        when EmployeeID = 4 then 
             (2 - ShipVia/Freight)*100 
   end as Raschet,
  EmployeeID 
from orders
where case 
    when EmployeeID = 5 then 
             (ShipVia/Freight < 1)
    when EmployeeID = 4 then 
             (ShipVia/Freight*Freight/1213 < 2)
    end 
select  
   case when EmployeeID = 5 then 
             (1 - ShipVia/Freight)*100 
        when EmployeeID = 4 then 
             (2 - ShipVia/Freight)*100 
   end as Raschet,
  EmployeeID 
from orders
where case 
    when EmployeeID = 5 then 
             ShipVia/Freight - 1
    when EmployeeID = 4 then 
             ShipVia/Freight*Freight/1213 - 2
    end < 0;
11 июл 12, 12:04    [12849610]     Ответить | Цитировать Сообщить модератору
 Re: case в выражении where (ошибка на знак сравнения)  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
Гениально :)
Спасибо Вам, огромное.
11 июл 12, 12:06    [12849621]     Ответить | Цитировать Сообщить модератору
 Re: case в выражении where (ошибка на знак сравнения)  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Virtuoz,а зачем тут case то вообще нужен?
select  
   case when EmployeeID = 5 then 
             (1 - ShipVia/Freight)*100 
        when EmployeeID = 4 then 
             (2 - ShipVia/Freight)*100 
   end as Raschet,
  EmployeeID 
from orders
where (EmployeeID = 5 and ShipVia/Freight < 1)
or 
(EmployeeID = 4 and ShipVia/Freight*Freight/1213 < 2 )

автор
Решил переписать этот громадный union используя case

какое-то сомнительное занятие.
11 июл 12, 12:07    [12849636]     Ответить | Цитировать Сообщить модератору
 Re: case в выражении where (ошибка на знак сравнения)  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
автор
Virtuoz,а зачем тут case то вообще нужен?


Упростить скрипт, повысив "читабельность".
А какие еще будут варианты? Буду очень благодарен за совет.
11 июл 12, 12:09    [12849666]     Ответить | Цитировать Сообщить модератору
 Re: case в выражении where (ошибка на знак сравнения)  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Ну и сравнивайте два case. А вообще, подход так себе. Гораздо оптимальнее расписать через union all. А еще лучше сделать вычисляемые столбцы, тогда можно будет индексы прикрутить.
11 июл 12, 12:11    [12849681]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить