Здесь очень много проблем. Ломать его немного вниз:
case
when opt.premiumcurrency is not null
and opt.structurename is not null
Из условия where
, opt.premiumcurrency
не может быть пустым, так что проверка ничего не добавляя.
then currency = opt.premiumcurrency
Вы не можете установить здесь значение; похоже, вы хотите, чтобы это выражение было помечено как currency
в финальном выпуске, как показала Арка.
case
when opt.notionalcurrency = opt.basecurrency
and opt.premiumcurrency = opt.termcurrency
then price = opt.termmarketpricepercent/opt.notional
Теперь вы ищете цену, а не валюту, поэтому это не является частью предыдущей статьи; что означает, что вы должны были иметь end as currency,
. Но у вас также нет условия else
, что означает, что ваше выражение в валюте будет равно null, если opt.structurename
имеет значение NULL; неясно, если это то, что вы хотите.
Но все эти условия должны быть истинными из-за вашего предложения where
, что делает весь этот case
избыточным. И снова вам нужен псевдоним выражения, а не пытаться установить значение с =
.
else
case
when opt.premiumcurrency = opt.basecurrency
then price = opt.basemarketprice /100
else
price = opt.termmarketpriceprecent /100
end
end
Вы вложенный случай вот так это выглядит, как вы пытаетесь преобразовать, если/ELSIF/еще построить непосредственно, без рассмотрения, как семантика case на самом деле работает. Вложенный корпус/конец не нужен, поскольку это означает, что/end может быть частью закрывающего футляра.Но, как отмечено выше, первое условие when
всегда должно быть истинным, и opt.premiumcurrency = opt.basecurrency
также всегда должно быть правдой, поэтому все это тоже избыточно.
when price = 0 then price = 0.000001
Это просто плавает там, так что это должно быть внешний корпус или декодированием, или, возможно, в least()
, если значение не может быть отрицательным.
Так с where
условий, которые вы показали, это может быть уменьшено до:
select opt.blo,
case
when opt.structurename is not null then opt.premiumcurrency
end as currency,
case
when opt.termmarketpricepercent = 0 then 0.000001
else opt.termmarketpricepercent/opt.notional
end as price
from interface opt
where opt.notionalcurrency = opt.basecurrency
and opt.premiumcurrency = opt.termcurrency;
Если условие where
носит временный характер и вам нужен более общий запрос, то это еще проще, чем вы делали это:
select opt.blo,
case
when opt.premiumcurrency is not null
and opt.structurename is not null
then opt.premiumcurrency
end as currency, -- still no 'else' so null if structurename is null
decode (
case
when opt.notionalcurrency = opt.basecurrency
and opt.premiumcurrency = opt.termcurrency
then opt.termmarketpricepercent/opt.notional
when opt.premiumcurrency = opt.basecurrency
then opt.basemarketprice /100
else opt.termmarketpricepercent /100
end, 0, 0.000001) as price
from interface opt;
(я сменил blo.opt
на opt.blo
, как заметил сатья, а также исправили опечатку в по меньшей мере одной ссылки на колонке ...)
На основе вашего последнего изменения вы хотите, чтобы валюта и цена были выбраны на основе тех же условий, что не было очевидно из исходного запроса. Каждый случай может оценивать только одно значение, поэтому вам нужно повторить условия в двух выражениях: один для валюты и один для цены; и тогда вы все равно хотите изменить цену, если она равна нулю. Опять же предполагая, что where
является временным:
select opt.blo,
case
when opt.notionalcurrency = opt.basecurrency
and opt.premiumcurrency = opt.termcurrency
then opt.notionalcurrency
when opt.notionalcurrency = opt.premiumcurrency
then opt.termcurrency
else opt.notionalcurrency
end as currency,
decode (
case
when opt.notionalcurrency = opt.basecurrency
and opt.premiumcurrency = opt.termcurrency
then opt.termmarketpricepercent/opt.notional
when opt.notionalcurrency = opt.premiumcurrency
then opt.basemarketprice/100
else opt.termmarketpricepercent/100
end, 0, 0.000001) as price
from interface opt;
Расчет цена такая же, как и прежде, выражение валюты изменилось, чтобы соответствовать той же логике. Тем не менее, похоже, вы потеряли structurename
. И есть основополагающее предположение, что ни одно из значений валюты не является нулевым, действительно.
SQL Fiddle с частичной таблицей и данными нет, просто чтобы показать, что запросы не являются ошибками.
Отсутствует запятая после 'blo.opt' – Sathya
Второй случай следует за первым, без условия else/case. Кроме того, я думаю, что у вас слишком много вложенных случаев без причины, пожалуйста, отредактируйте [edit] и сообщите, какие именно ваши требования: – Sathya
Редактирование вашего вопроса таким образом, чтобы недействительный существующий ответ казался грубым. Кто-то, придя к этому вопросу, теперь подумает, что ответ Bonesist не имеет значения или неправилен, если он не проверяет историю изменений. –