Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Max
- Сообщения: 2
- Зарегистрирован: 31 май 2005, 18:22
Сообщение
Max » 31 май 2005, 18:25
есть такой запрос:
Код: Выделить всё
select job.jobid
, Servicetype.description as servicetype
, if(b.offeramount is null) then 0 else s.billamount*100/b.offeramount end
, s.paymenttotal
, s.checkdate
, s.invoicemaileddate
, 'open' as servicestatus
from job j, service s, servicetype st, buyout b
where 1 = 1
and s.jobid = j.jobid
and st.servicetypeid = s.servicetypeid
and b.serviceid = s.serviceid
and s.cancelleddate is null
and b.offeramount is not null
какие есть функции или способы заменить эту конструкцию в обычном запросе ??
Код: Выделить всё
if(b.offeramount is null) then 0 else s.billamount*100/b.offeramount end
или подскажите есть функция по типу isnull ??
-
MuirsheenDurkin
- Сообщения: 44
- Зарегистрирован: 21 янв 2005, 10:18
Сообщение
MuirsheenDurkin » 31 май 2005, 18:39
Max писал(а):if(b.offeramount is null) then 0 else s.billamount*100/b.offeramount end
case
when (b.offeramount is null) then
0
else
s.billamount*100/b.offeramount
end
Если я правильно угадал версию твоего сервера....
-
Max
- Сообщения: 2
- Зарегистрирован: 31 май 2005, 18:22
Сообщение
Max » 31 май 2005, 19:10
case - не работает .. версия WI-V6.0.1.6 ...

-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 31 май 2005, 19:15
тогда - в сад.
-
sag
- Сообщения: 116
- Зарегистрирован: 02 ноя 2004, 11:42
Сообщение
sag » 01 июн 2005, 08:39
kdv писал(а):тогда - в сад.
лукавишь, можно выкрутится. Приглядевшись к желаемому:
Код: Выделить всё
if(b.offeramount is null) then 0 else s.billamount*100/b.offeramount end
вижу, что и в случае значения поля b.offeramount и null и 0 в результате хочется получить 0. В этом разрезе можно использовать какую-нибудь подходящую по типу и действию udf-ку:
Код: Выделить всё
MYUDF_NVL_F(b.offeramount)*100/b.offeramount
-
MuirsheenDurkin
- Сообщения: 44
- Зарегистрирован: 21 янв 2005, 10:18
Сообщение
MuirsheenDurkin » 01 июн 2005, 09:25
1. Версию надо писать сразу.
2. Есть способ лучше.
create procedure smart_divide
(
offeramount <соотв. типа>,
billamount <соотв. типа>
)
returns
(
result <соотв. типа>
)
as
begin
if (offeramount is null) then
result = 0;
else
result = billamount * 100 / offeramount;
suspend;
end^
потом вместо case'a
(select result from smart_divide(b.offeramount, s.billamount))
Сработает.
-
sag
- Сообщения: 116
- Зарегистрирован: 02 ноя 2004, 11:42
Сообщение
sag » 01 июн 2005, 09:49
MuirsheenDurkin писал(а):2. Есть способ лучше.
...
Сработает.
Работать будет, а вот по поводу “способ лучше” можно спорить, но не буду. Вариант с udf лично мне нравится больше. Для меня плюсы – это “экономия на кнопконажимательстве” при использовании udf, возможность использования их без всяких штучек внутри агрегатных выражений; сделав их один раз раз пользую и сейчас.
-
MuirsheenDurkin
- Сообщения: 44
- Зарегистрирован: 21 янв 2005, 10:18
Сообщение
MuirsheenDurkin » 01 июн 2005, 09:58
sag писал(а): по поводу “способ лучше” можно спорить, но не буду.
Согласен, пусть вопрошающий выбирает. Мир с ними обоими.