Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 деление на ноль (в Select`e)  [new]
DemOk
Member

Откуда: Московская Область г. Железнодорожный
Сообщений: 99
Здравствуйте !
select 'деление на ноль', 10/kol from table

Возможно ли используя только Select вывести строки у которых kol=0

Например если в таблице table встречается 3 записи с kol=0 то в результате селекта они вывидутся и 10/kol будет null (Либо 0, либо любое значение)

Спасибо !
16 июл 07, 17:02    [4394551]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
decode/case поможет
16 июл 07, 17:06    [4394588]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116074
Декоды например

SQL> with tab1 as
  2  (select 0 kol from dual
  3   union all
  4   select 1 kol from dual
  5   )
  6  select decode(kol, 0, 'Delenie na nolj', 'OK'), decode(kol,0,0,10/kol) from tab1
  7  /
 
DECODE(KOL,0,'DELENIENANOLJ',' DECODE(KOL,0,0,10/KOL)
------------------------------ ----------------------
Delenie na nolj                                     0
OK                                                 10
 
SQL> 

Если Вам нужны только плохие строки соответственно через WHERE ...
16 июл 07, 17:06    [4394590]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
DemOk
Member

Откуда: Московская Область г. Железнодорожный
Сообщений: 99
Большое спасибо !
16 июл 07, 17:10    [4394620]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
А может кто-нибудь подскажет более гибкое решение (на ум приходит что-то вроде "можно ли поймать исключение на уровне отдельной строки SQL и обаботав его продолжить выполнение запроса :)") на случай если я НЕ ЗНАЮ где у меня знаменатель и следовательно не могу анализировать его на предмет нуля?

Попробую немного упростить и сформулировать конкретную проблему. Есть некое представление, в котором есть числовые поля a1..a20, нужно для каждой строки представления вычислить некую функцию зависящую от a1..a20, к примеру

select a1 + a2 * (a3 - a4) / (a5 - a6)
from view1

Функция может быть очень сложная и следовательно определение и анализ знаменателей затруднен.
28 авг 07, 18:38    [4587760]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
На данный момент приходит в голову только написание и использование своей функции вида

function CalcFormula(p_formula in varchar2,
a1 in number,
a2 in number,
...
a20 in number) return number;

которая подставит значения, посчитает и в случае чего поймает исключение
28 авг 07, 18:44    [4587788]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
Чтобы не показаться полным идиотом (касательно затрудненного определения и анализа знаменателей) отмечу, что формула конструируется динамически, соответственно анализ должен быть автоматизированным
28 авг 07, 18:49    [4587826]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
DemOk
Здравствуйте !
select 'деление на ноль', 10/kol from table

Возможно ли используя только Select вывести строки у которых kol=0

Например если в таблице table встречается 3 записи с kol=0 то в результате селекта они вывидутся и 10/kol будет null (Либо 0, либо любое значение)

select 'деление на ноль', 10/NULLIF(kol,0) from table
28 авг 07, 18:49    [4587827]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8130
andrey_anonymous
select 'деление на ноль', 10/NULLIF(kol,0) from table
Отличное решение!
28 авг 07, 18:56    [4587855]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
Товарисчи! Хватит обсуждать проблему DemOk-а, она давно решена, посмотрите на мою :) Или я сделал ошибку не создав свой топик, а дописав существующий?
28 авг 07, 18:59    [4587866]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116074
boomer0k
Товарисчи! Хватит обсуждать проблему DemOk-а, она давно решена, посмотрите на мою :) Или я сделал ошибку не создав свой топик, а дописав существующий?


Вы уверены, что это решение только проблемы DemOk-a ?
28 авг 07, 19:01    [4587878]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
boomer0k
Или я сделал ошибку не создав свой топик, а дописав существующий?

Определенно сделали.
Когда будете создавать новый топик, потрудитесь поподробнее описать проблему - пока не очень понятно что означает выражовывание "не знаю где у меня знаменатель"
28 авг 07, 19:02    [4587884]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
dmidek
boomer0k
Товарисчи! Хватит обсуждать проблему DemOk-а, она давно решена, посмотрите на мою :) Или я сделал ошибку не создав свой топик, а дописав существующий?


Вы уверены, что это решение только проблемы DemOk-a ?


Абсолютно - прочитайте все мои посты в данном топике. Или предложите конкретное решение для моей проблемы :)
28 авг 07, 19:02    [4587886]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
andrey_anonymous
boomer0k
Или я сделал ошибку не создав свой топик, а дописав существующий?

Определенно сделали.
Когда будете создавать новый топик, потрудитесь поподробнее описать проблему - пока не очень понятно что означает выражовывание "не знаю где у меня знаменатель"


Действительно не знаю - формула конструируется динамически.
28 авг 07, 19:03    [4587892]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
boomer0k
формула конструируется динамически.

Добавьте NULLIF в конструктор формул.
28 авг 07, 19:04    [4587896]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116074
boomer0k
dmidek
boomer0k
Товарисчи! Хватит обсуждать проблему DemOk-а, она давно решена, посмотрите на мою :) Или я сделал ошибку не создав свой топик, а дописав существующий?


Вы уверены, что это решение только проблемы DemOk-a ?


Абсолютно - прочитайте все мои посты в данном топике. Или предложите конкретное решение для моей проблемы :)


Когда Вы будете динамически конструировать свою формулу, после знака деления добавляете
NULLIF( а в конце ,0)
28 авг 07, 19:06    [4587899]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
andrey_anonymous
boomer0k
формула конструируется динамически.

Добавьте NULLIF в конструктор формул.


NULLIF должен применяться только к знаменателям, а я не знаю где они :)) Если прописать его везде, то простая формула а1+а2+а3 рискует превратиться в NULL в случае нулевого значения в одном из агрументов.
28 авг 07, 19:09    [4587909]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
boomer0k
andrey_anonymous
boomer0k
формула конструируется динамически.

Добавьте NULLIF в конструктор формул.

NULLIF должен применяться только к знаменателям, а я не знаю где они

Еще раз, по буквам: поправьте КОНСТРУКТОР ФОРМУЛ.
В конструкторе Вы должны совершенно точно знать где знаменатель, иначе конструирование просто невозможно ;)
28 авг 07, 19:11    [4587918]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116074
boomer0k
andrey_anonymous
boomer0k
формула конструируется динамически.

Добавьте NULLIF в конструктор формул.


NULLIF должен применяться только к знаменателям, а я не знаю где они :)) Если прописать его везде, то простая формула а1+а2+а3 рискует превратиться в NULL в случае нулевого значения в одном из агрументов.


Я же написал - после знака деления ! Знак деления Вы же можете идентифицировать.
У Вас же там все равно какой- то лексический анализатор должен существовать,
который например выявляет соответствие скобок и т.д. Вот и расширьте его двумя
опциями...
28 авг 07, 19:12    [4587921]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
dmidek
boomer0k
andrey_anonymous
boomer0k
формула конструируется динамически.

Добавьте NULLIF в конструктор формул.


NULLIF должен применяться только к знаменателям, а я не знаю где они :)) Если прописать его везде, то простая формула а1+а2+а3 рискует превратиться в NULL в случае нулевого значения в одном из агрументов.


Я же написал - после знака деления ! Знак деления Вы же можете идентифицировать.
У Вас же там все равно какой- то лексический анализатор должен существовать,
который например выявляет соответствие скобок и т.д. Вот и расширьте его двумя
опциями...


Пасиба, идея понятна. Конец дня, голова квадратная... Формула конструируется не мною, но это не мешает ее переконструировать, но это по сути и будет являться определением знаменателей. Просто ставить NULLIF после деления не вариант, потому что формула a1/(a2/a3) + а4, случае а3 = 0 должна вернуть а4, а не NULL
28 авг 07, 19:26    [4587982]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116074
boomer0k
Просто ставить NULLIF после деления не вариант, потому что формула a1/(a2/a3) + а4, случае а3 = 0 должна вернуть а4, а не NULL


О! Вы уверены ? Вспомнил название книги из детства "Веселая арифметика" :-)
Ну неважно, пусть тогда Ваши "анализаторы" подкрутят соответственно...
28 авг 07, 19:32    [4588001]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
dmidek
boomer0k
Просто ставить NULLIF после деления не вариант, потому что формула a1/(a2/a3) + а4, случае а3 = 0 должна вернуть а4, а не NULL


О! Вы уверены ? Вспомнил название книги из детства "Веселая арифметика" :-)
Ну неважно, пусть тогда Ваши "анализаторы" подкрутят соответственно...


Абсолютно... Вспомнил название книги из детства "Матанализ"... Требования ставлю не я, а мне. a1/(a2/a3) + а4 должно вернуть именно а4 если а3 равно нулю.
Вопрос был именно в том как уйти от необходимости написания анализаторов.
28 авг 07, 19:35    [4588015]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
dmidek, я думаю boomer0k решил, что при таких значениях a1/(a2/a3) + а4 должно вернуть именно а4 если а3 равно нулю., получается a1/inf + a4, где inf это бесконечность, но в Oracle нет понятия бесконечности. Тем более, в матанализе, значения стремятся к 0(то есть бесконечно малые), а не равны 0.
28 авг 07, 19:40    [4588034]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
boomer0k
Member

Откуда:
Сообщений: 14
xymbo
dmidek, я думаю boomer0k решил, что при таких значениях a1/(a2/a3) + а4 должно вернуть именно а4 если а3 равно нулю., получается a1/inf + a4, где inf это бесконечность, но в Oracle нет понятия бесконечности. Тем более, в матанализе, значения стремятся к 0(то есть бесконечно малые), а не равны 0.


Понятие видимо есть, но оно завуалировано
15 сен 07, 13:11    [4673177]     Ответить | Цитировать Сообщить модератору
 Re: деление на ноль (в Select`e)  [new]
MazoHist
Guest
a1/(a2/a3) + a4 = (a1*a3)/a2 + a4 - и требование вполне законно, если a2<>0.
17 сен 07, 01:07    [4675100]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить