Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > сравение результата функции to_number с числом


Автор: s_a_s_h_a 4.7.2009, 16:10
проблема в следующем...
Есть запрос

Код

select to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ')) as conv_sqr
from ...


так вот, он выдает список чисел, суммирование работает

Код

select sum(t.conv_sqr)
from
(select to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ')) as conv_sqr
from ... ) t 


а такая вещь уже валится с ошибкой "ORA-01722: неверное число"

Код

select t.conv_sqr
from
(select to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ')) as conv_sqr
from ... ) t 
where t.sqr < 42


Вопрос: почему? и как обойти эти грабли?

З.Ы.: пробовал еще cast(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ') as number(12,2)) такая же ерунда

чуть не забыл... Oracle 9

Автор: Zloxa 5.7.2009, 14:29
Цитата(s_a_s_h_a @  4.7.2009,  16:10 Найти цитируемый пост)
Вопрос: почему?

Что такое t.sqr?

ЗЫ в таких ситуациях лучше явно указывать http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams129.htm#sthref406 в третьем параметре to_number, либо принудительно его устанавливать перед выполнением запроса. Потому как этот параметр сессии устанавливается с клиента и,  как следствие, этот запрос может перестать работать с других клиентских машин.

Автор: s_a_s_h_a 5.7.2009, 20:07
извиняюсь... опечатался:

Код

select t.conv_sqr
from
(select to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ')) as conv_sqr
from ... ) t 
where t.conv_sqr < 42


Запрос из Москвы гласит, что нужно посчитать средние стоимости за кв. метр. А эти квадратные метры я могу получить только из текстового поля. Пользователи могут забивать разделители целой и дробной части по разному. Я привожу все числа к одному виду, в котором это работает на моей машине, на других машинах этот запрос выполнятся не будет.

И меня интересует, как обойти грабли, когда вложенный запрос выполняется, как минимум выводятся на экран нормальные числа, а вот сравнение дальше не пашет :(

Автор: Zloxa 5.7.2009, 22:53
Цитата(s_a_s_h_a @  5.7.2009,  20:07 Найти цитируемый пост)
как обойти грабли,

Разные грабли надо обходить по разному.
Сначала надо понять с какими граблями мы имеем дело.

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

Автор: s_a_s_h_a 6.7.2009, 10:44
Запихал в курсор запрос, ну и if-ом условие поставил. Все замечательно работает, даже exception не пришлось ставить:

Код

declare
  p_summa number(15,2);

cursor cur is select v.re_price, to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' '),'99999999D00') as sqr
from
(.....) v
where v.sqr is not null;

begin
     p_summa := 0;
     for c in cur loop
      if(c.sqr < 42) then   
         p_summa := p_summa + c.sqr;
      end if;   
     end loop;  

     dbms_output.put_line(to_char(p_summa));     
end;


в общем, хрень какая-то... и главное суммирование-то работает  smile 

Спасибо за внимание к проблеме.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)