.net333 Ответов: 1

Оператор Case в SQL server


Привет Ребята,
Нужно получить цену из нескольких запросов.

если цена 1-го запроса равна 0, то выполните 2-й запрос.
если цена 2-го запроса равна 0, то выполните 3-й запрос.

Я попробовал с заявлением по делу. но это работает не так, как ожидалось.

Пожалуйста, помогите мне исправить это.

Что я уже пробовал:

select R.Id,(case 
when R.Price !=0.00 then R.Price
when R.Price =0.00
then
(select max(C.price) from ItemOption IO, Options O, ItemOptionChoices C where IO.OptionId=O.OptionId 
and O.OptionId = C.OptionId and O.MultipleSelections='Radio Buttons' and MenuItemId=R.Id)
 when R.Price =0.00
 then
 (select max(price) as variantprice from ItemVariation IV where  IV.ItemId=R.Id)
 end) as Price
from RestaurantMenu as R where CategoryId='5b7a3bfd-427f-4813-a54e-ff32f47b95a4' and EntityType='Item'
 Order by CategoryOrder

OriginalGriff

"Это не работает", вероятно, самый бесполезный отчет о проблеме, который мы получаем - и мы получаем его много. Она ничего не говорит нам о том, что происходит или когда это происходит.
Итак, расскажите нам, что он делает, чего вы не ожидали, или не делает, что вы сделали.
Расскажите нам, что вы сделали, чтобы это произошло.
Сообщайте нам о любых сообщениях об ошибках.
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

CHill60

Пока вы редактируете свой вопрос, почему бы не добавить некоторые примеры данных и ожидаемые результаты!

1 Ответов

Рейтинг:
0

CHill60

Вместо того чтобы использовать эти подзапросы, попробуйте использовать общие табличные выражения.
Обратите внимание, что вы перечислили условие WHEN R.Price =0.00 дважды.
Это очень, очень старомодный способ выражения объединения - не делайте этого таким образом.

Из той небольшой информации, которую Вы нам предоставили, можно сделать следующий запрос вероятно работа.

;with c1 as
(
	select max(C.price) as C1Price, MenuItemId
	from ItemOption IO, 
	join Options O ON IO.OptionId=O.OptionId
	join ItemOptionChoices C ON  O.OptionId = C.OptionId
	where O.MultipleSelections='Radio Buttons' 
), c2 as 
(
	select max(price) as c2Price, ItemId as variantprice from ItemVariation IV 
)
select R.Id,
	(SELECT TOP 1 P FROM (VALUES (R.Price),(C1Price),(C2Price)) as tmp(P) WHERE P <> 0 ORDER BY P ASC) as maxPrice
from RestaurantMenu as R
left join c1 ON MenuItemId=R.Id
left join C2 ON IV.ItemId=R.Id
where CategoryId='5b7a3bfd-427f-4813-a54e-ff32f47b95a4' and EntityType='Item'
 Order by CategoryOrder
Обратите внимание на использование встроенной временной таблицы для получения значений, адаптированных из решения с помощью свен[^]

Это, возможно, некоторую дополнительную работу, чтобы обрабатывать значения null.