Как в запрос добавить условия ??

Запросы, планы, оптимизация запросов, ...

Модераторы: 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

Re: Как в запрос добавить условия ??

Сообщение 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 писал(а): по поводу “способ лучше” можно спорить, но не буду.
    Согласен, пусть вопрошающий выбирает. Мир с ними обоими.

    Ответить