Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по синтасису 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.011 c
11-1106571334
WhiteGuy
2005-01-24 15:55
2005.09.11
KeyDown, strtoint, StringReplace ...


1-1124472520
Piter
2005-08-19 21:28
2005.09.11
Функция, вырезающая строку между двумя разделителями


6-1116865895
ATarget
2005-05-23 20:31
2005.09.11
PIPE каналы


9-1115477118
beginner136
2005-05-07 18:45
2005.09.11
directinput.


1-1124343139
kblc
2005-08-18 09:32
2005.09.11
Ссылка на * of object в виде строки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский