Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

Вопрос по синтасису coalesce в оракле   Найти похожие ветки 

 
Rule ©   (2005-07-26 16:41) [0]

подскажите пожалуйста как сделать вот такой запрос
select coalesce (field1,0) from table1

Синтаксис Оракла требует чтоб второй параметр, в моем случае "0" тоже был полем ...
как обойти

вариант if then  не подходит так как в этом случае field1  надо писать два раза,  а у меня єто довольно  большой подзапрос ....
подскажите пожалуйста ...


 
Sergey13 ©   (2005-07-26 16:46) [1]

А тебе случаем не NVL нужен?


 
Fay ©   (2005-07-26 16:48) [2]

2 Rule ©   (26.07.05 16:41)
> Синтаксис Оракла требует чтоб второй параметр, в моем
>случае "0" тоже был полем ...

Чушь.


 
Rule ©   (2005-07-26 16:50) [3]

Fay ©   (26.07.05 16:48) [2]
почему єто чушь ORACLE8  и по английцки я читать умею


 
Johnmen ©   (2005-07-26 16:51) [4]

>Rule ©   (26.07.05 16:50) [3]

Я тоже не верю, что Оракул отклонился от стандарта.
Ошибку и текст запроса в студию !


 
Rule ©   (2005-07-26 16:52) [5]

Sergey13 ©   (26.07.05 16:46) [1]

Точно, Сергей, большое спасибо ...


 
Sergey13 ©   (2005-07-26 16:52) [6]

Ты чего хочешь то в результате?


 
Rule ©   (2005-07-26 16:52) [7]

Johnmen ©   (26.07.05 16:51) [4]
щас секундочку


 
Rule ©   (2005-07-26 16:53) [8]

вот запрос

select a.date_trn,
       a.time_trn,
       b.name_services,
       a.sum_for_what,
       b.unit_of_measurements,
       a.price_terminal,
       a.price_terminal*a.sum_for_what,
       (select c.VAL from  V_INT_DTARIF_ITEMS c,
                                               V_INT_DTARIF d,
                                               V_CLIENT_DTARIF e
                                          where c.dtarif=d.id
                                          and d.id=e.int_dtarif
                                          and e.id_client=a.id_client
                                          and c.id_service=a.id_services_for_what)||
        (case    when (select c.TYPE_VAL from  V_INT_DTARIF_ITEMS c,
                                               V_INT_DTARIF d,
                                               V_CLIENT_DTARIF e
                                          where c.dtarif=d.id
                                          and d.id=e.int_dtarif
                                          and e.id_client=a.id_client
                                          and c.id_service=a.id_services_for_what)
              = "C" then " коп."
              else " %"
               end) as discount,
       a.BASE_DELTA_SUM,
       a.SUM_THAN_REAL,
       a.SUM_THAN

       from V_ECFIL139 a,  V_ECFIL001 b
       where a.id_services_for_what=b.id_services
       and a.reason_change=11


 
Rule ©   (2005-07-26 16:54) [9]

вот то страшное составное поле первая часть пишет количество скидки а вторая тип скидки, копейки или проценты вот если скидки под клиента нет, то тип скидки выдет проценты а количество должно быть 0, тоесть
(select c.VAL from  V_INT_DTARIF_ITEMS c,
                                              V_INT_DTARIF d,
                                              V_CLIENT_DTARIF e
                                         where c.dtarif=d.id
                                         and d.id=e.int_dtarif
                                         and e.id_client=a.id_client
                                         and c.id_service=a.id_services_for_what)

вот эту часть нада сделать NVL


 
Rule ©   (2005-07-26 16:55) [10]

если писать вот так вот
select a.date_trn,
       a.time_trn,
       b.name_services,
       a.sum_for_what,
       b.unit_of_measurements,
       a.price_terminal,
       a.price_terminal*a.sum_for_what,
       coalesce((select c.VAL from  V_INT_DTARIF_ITEMS c,
                                               V_INT_DTARIF d,
                                               V_CLIENT_DTARIF e
                                          where c.dtarif=d.id
                                          and d.id=e.int_dtarif
                                          and e.id_client=a.id_client
                                          and c.id_service=a.id_services_for_what),"0")||
        (case    when (select c.TYPE_VAL from  V_INT_DTARIF_ITEMS c,
                                               V_INT_DTARIF d,
                                               V_CLIENT_DTARIF e
                                          where c.dtarif=d.id
                                          and d.id=e.int_dtarif
                                          and e.id_client=a.id_client
                                          and c.id_service=a.id_services_for_what)
              = "C" then " коп."
              else " %"
               end) as discount,
       a.BASE_DELTA_SUM,
       a.SUM_THAN_REAL,
       a.SUM_THAN

       from V_ECFIL139 a,  V_ECFIL001 b
       where a.id_services_for_what=b.id_services
       and a.reason_change=11


 
Rule ©   (2005-07-26 16:57) [11]

то пишет
ORA-00904: Invalid column name


 
Rule ©   (2005-07-26 16:59) [12]

а только что написал вместо coalesce -  NVL, то заработало ...именно это мне и надо было


 
Rule ©   (2005-07-26 17:00) [13]

Rule ©   (26.07.05 16:57) [11]
а вот если вместо нуля написать какоелибо поле, то он когда пустое значение подставляет это поле, как и полагается ... тоесть он требует поле в качестве параметров, а не значения, а вот в Фаерберде можно и значение написать и потребность в NVL  как бы отпадает


 
Johnmen ©   (2005-07-26 17:03) [14]

>Rule ©   (26.07.05 17:00) [13]

А если вместо "0" написать 0 ?


 
Rule ©   (2005-07-26 17:04) [15]

Johnmen ©   (26.07.05 17:03) [14]
тоже самое, сразу пробовал


 
Johnmen ©   (2005-07-26 17:05) [16]

>Rule ©   (26.07.05 17:04) [15]

Да... Занятно... Отступили-таки...:)


 
evvcom ©   (2005-07-26 17:05) [17]

Вот любители запихивать (иначе не назовешь) подзапросы внутрь возвращаемых значений и вязать с внешним подзапросом. Это хорошо, если оптимизатор разрулит такую дрянь и внутренние подзапросы выполнит по одному разу, а если на каждую строку будет этот подзапрос выполнять? Уснешь нафиг, а юзер повесится.


 
Reindeer Moss Eater ©   (2005-07-26 17:08) [18]

И в оракле можно указать как поле так и значение.
Decode(что-то, опция_1, выражение_1, опция_2, выражение_2, ......,опция_n,выражение_n,выражение_во_всех_прочих_случаях)


 
Rule ©   (2005-07-26 17:08) [19]

evvcom ©   (26.07.05 17:05) [17]
другого выхода тут нет ...
и особых затрат времени нет, на поной базе выполняется за очень короткое время, моргнуть не успеешь, тем более запрос выполняется раз в месяц для составления отчета, поэтому помоему никаких тут глюков не вижу ..., таблицы то маленькие, те которые в поля встраиваю


 
Rule ©   (2005-07-26 17:09) [20]

Reindeer Moss Eater ©   (26.07.05 17:08) [18]
немного не то, я ж не буду перечислять все возможные варианты процентных и абсолютных скидок ... смотрел уже в эту сторону


 
evvcom ©   (2005-07-26 17:09) [21]


> Да... Занятно... Отступили-таки...:)

Да нифига не отступили. Нормально оракловый coalesce принимает хоть поле, хоть константу. Проверял только что на 9.2.0.6. И в документации написано "expression". Просто "афтар" чего-то напутал.


 
Johnmen ©   (2005-07-26 17:10) [22]

>evvcom ©   (26.07.05 17:05) [17]

А что, они должны в данном случае по разу выполнится ?????????
Тогда это бред какой-то......


 
Johnmen ©   (2005-07-26 17:11) [23]

>evvcom ©   (26.07.05 17:09) [21]

Кому же верить, если хочется всем ?


 
Rule ©   (2005-07-26 17:11) [24]

Johnmen ©   (26.07.05 17:10) [22]
я так понял evvcom © имел ввиду внешнее объединение вместо подзапросов ...


 
Rule ©   (2005-07-26 17:12) [25]

evvcom ©   (26.07.05 17:09) [21]
вот щас возьму запросик попроще ... и скажу точно


 
evvcom ©   (2005-07-26 17:12) [26]


> другого выхода тут нет ...

Выход есть всегда. См. http://delphimaster.net/view/3-1122378297/, там запрос аналогичен твоему, а в [8] я эти "внутренности" вынес наружу.


 
Johnmen ©   (2005-07-26 17:14) [27]

>Rule ©   (26.07.05 17:11) [24]

Если он это имел в виду, то не учел, что не всегда можно получить желаемое, просто заменив вложенные кореллирующие на соединение. И наоборот.


 
Rule ©   (2005-07-26 17:14) [28]

таблица состоит из одного поля сделал запрос
select coalesce(CARD_NUMBER,"0") from V_BL
тот же результат так что наверное в Oracle8  под другома нежели в 9


 
Rule ©   (2005-07-26 17:15) [29]

Johnmen ©   (26.07.05 17:14) [27]
вот и я так попытался объяснить токо не так хорошо получилось ...


 
Rule ©   (2005-07-26 17:16) [30]

evvcom ©   (26.07.05 17:12) [26]
я не уверен что так будет быстрее,

я лично уверен, что так объединять стоит если вот те таблицы с которыми клеишь большие, а если они по 3-20 записей, то оптимальнее использовать именно подзапросы (проверено на практике), и ИМХО конечно, но вот такой с подзапросами запрос более читабельный нежели с объединениями ...

поэтому я считаю, что объединять стоит если объединямые таблицы большие, именно тогда будет выйгрышь в противном случае все только усложняется


 
evvcom ©   (2005-07-26 17:17) [31]


> А что, они должны в данном случае по разу выполнится ?????????

А если на миллион строк выполнить миллион выборок из еще миллиона строк, сколько ж времени потребуется?
А можно сделать одну выборку, потом ее сджойнить еще с одной и получим тот же результат за гораздо меньшее время.

> Johnmen ©   (26.07.05 17:11) [23]
> >evvcom ©   (26.07.05 17:09) [21]
>
> Кому же верить, если хочется всем ?

В данном случае [18] и [21]


 
Rule ©   (2005-07-26 17:19) [32]

evvcom ©   (26.07.05 17:12) [26]

кстати там немного не то ... дело в том, что там ты использовал внутреннее объединение, в этом случае у меня будут те записи таблицы, в которых будет присутствовать скидка, в моем случае надо внешнее объединение


 
Rule ©   (2005-07-26 17:20) [33]

evvcom ©   (26.07.05 17:17) [31]
В данном случае [18] и [21]


я понимаю что на бумаге написано ... но я то руками то сделал вроде все правильно ...
тяжело ошибиться в однострочном запросе, если пишешь их довольно долго уже ...


 
evvcom ©   (2005-07-26 17:22) [34]


> поэтому я считаю, что объединять стоит если объединямые
> таблицы большие, именно тогда будет выйгрышь в противном
> случае все только усложняется

Выигрыш будет в любом случае, если оптимизатор не разрулит сам. Вопрос только в том, будет ли он заметен. А насчет усложнения все зависит от того, как ты привык думать. Мне нагляднее обозревать INNER JOIN ... ON, нежели потом в where выискивать по каким же полям там эти таблицы/подзапросы вяжутся? Имхо.


 
Johnmen ©   (2005-07-26 17:22) [35]

>Rule ©   (26.07.05 17:19) [32]

Немного режет слух... Не надо называть "соединение" (JOIN) "объединением" (UNION).


 
Rule ©   (2005-07-26 17:24) [36]

Johnmen ©   (26.07.05 17:22) [35]
сори :-), естественно имел ввиду соединение :-), тоесть джоин


 
Rule ©   (2005-07-26 17:25) [37]

evvcom ©   (26.07.05 17:22) [34]
я ж говорю что в данном случае
INNER JOIN не подходить надо LEFT JOIN а там уже мудрить и получается чем больше таблиц я слева прикрепляю, тем больше они перемнжаются, и тогда использование тех же агрегатов становится нереальным ... помоему геморой


 
Johnmen ©   (2005-07-26 17:28) [38]

>evvcom ©  

пост [27]


 
evvcom ©   (2005-07-26 17:29) [39]


> Rule ©   (26.07.05 17:20) [33]

Ладно, не буду про 8 говорить, а в 9 проверил, все работает.


 
Rule ©   (2005-07-26 17:30) [40]

evvcom ©   (26.07.05 17:29) [39]
на это и спишем :-), восьмой не может а девятый может :-)



Страницы: 1 2 вся ветка

Текущий архив: 2005.09.11;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.031 c
14-1124186487
PVOzerski
2005-08-16 14:01
2005.09.11
Перестал загружаться комп с 98-ми - в какую сторону копать?


9-1116476897
Slavikk
2005-05-19 08:28
2005.09.11
GLScene Как сделать квестовое перемещение


3-1122800706
NickMan
2005-07-31 13:05
2005.09.11
Возможен ли такой запрос?


4-1121967182
Creep1
2005-07-21 21:33
2005.09.11
Поймать событие сворачивания/разворачивания окна


2-1123618797
ronyn
2005-08-10 00:19
2005.09.11
Разобраться с координатами курсора.