Имя: Пароль:
IT
 
Специалисты по Oracle, спасите!
,
0 sda553
 
30.07.13
12:32
Вот подскажите, что это за неведомая и непонятная мне по глубине своей логики штука?
http://img-fotki.yandex.ru/get/9510/119259889.4/0_e25eb_470b5716_XXL.png
1 Попытка1С
 
30.07.13
12:33
Не проще обратиться на ораколовский форум, там быстрее ответят.
2 1Сергей
 
30.07.13
12:34
Альяс где?
3 sda553
 
30.07.13
12:34
(1) не зареган
4 Кирпич
 
30.07.13
12:34
Это картинки, на которых изображен процесс написания SQL запроса к базе данных.
5 Андрюха
 
30.07.13
12:34
(0) Я не спец, но может ошибка к/нибудь тривиальнейшая, типа мантисса отделяется от целой части запятой вместо точки.
6 Kolls
 
30.07.13
12:36
Попробуй одинарные кавычки убрать, т.е. не строку толкать, а число
7 sda553
 
30.07.13
12:37
to_number преобразовывает строку в число
(5) тогда бы to_number('3.00') так же упал бы, а он "ок"
8 Kolls
 
30.07.13
12:39
В последней выборке в avans NULLа случаем нету?
9 sda553
 
30.07.13
12:39
(8) судя по среднему скрину - нет
10 Kolls
 
30.07.13
12:40
а параллельно данные никто не колбасит?
11 sda553
 
30.07.13
12:41
(10) Ну колбасится чего то, но вряд ли кто то надо мной так шутит -  null то ставит, то убирает
12 sda553
 
30.07.13
12:42
(11) плюс where a1.avans='3.00' должен исключить nullы
13 Kolls
 
30.07.13
12:42
ну чудес то не бывает... по средней выборке пройдись по всему курсору... или там всего 2 записи?
14 NS
 
30.07.13
12:42
В нижних строчках, в нижней картинке, в сообщении об ошибке, вроде пробел в записи числа.
where выполняется после select.
15 NS
 
30.07.13
12:43
Да там вообще первое сообщение об ошибке - не число, а хрен знает что.
16 Jaap Vduul
 
30.07.13
12:44
Ну, так у тебе где-то в a1.avans строка есть, которая на число не похожа.
А то, что ты думаешь, что функция to_number только к двум строчкам итоговой выборки применяется, это заблуждение.
17 sda553
 
30.07.13
12:44
(13) Да всего две, там даже надпись на скрине видна что их всего две

(14) не..везде копипаста
18 sda553
 
30.07.13
12:44
(16) Тогда почему она на первом скрине применилась только к нужным 8-ми строчкам?
19 NS
 
30.07.13
12:45
(17) Я тебя не понял. В сообщении об ошибке пишет что у тебя не числа в avans в двух местах.
20 NS
 
30.07.13
12:46
(18) Потому что Оракл решил что в этом случае лучше сначала выполнить where
21 sda553
 
30.07.13
12:46
(19) Вот в этом то и дело
to_number('3.00) он признает числом
where avans='3.00' он то же признает

По принципу коммутативности он должен to_number(avans) признать числом, ан нет - ошибку рубит
22 Kolls
 
30.07.13
12:46
Вот смотри, первый запрос отрабатывает, так? просто тупо замени "1000" на "3", а не на "3.00"... если не взлетит... то надо руками смотреть на содержимое таблицы... и неплохо бы план запроса посмотреть,
23 Jaap Vduul
 
30.07.13
12:48
>>применилась только к нужным 8-ми строчкам
Это также заблуждение.
24 sda553
 
30.07.13
12:48
(22) Это строка, если поставить '3' то ничего нет, в таблице везде '3.00'

(20) Т.е. ты считаешь что разгадка в том, что в первом случае он сначала where делает - после вычисления, а в последнем, вначале вычисления - после where ?
25 NS
 
30.07.13
12:50
(24) Именно так.
26 Kolls
 
30.07.13
12:50
т.е. поле avans в структуре таблицы прописана как строка? хех, тогда ищи строки где разделителем стоит запятая, или еще что
27 sda553
 
30.07.13
12:54
(26) и как их тогда искать? Если любое where он может зарубить на конец, исходя из своей внутренней логики.
28 NS
 
30.07.13
12:58
(27) Не знаю. Сделай вложенный запрос с условием.
29 Jaap Vduul
 
30.07.13
13:01
(27)Через case сделай:
case
    when regexp_like(a1.avans, '^-?\d+(\.\d+)?$')
        then to_number(a1.avans)
end
30 NS
 
30.07.13
13:04
(29) Я почти уверен что это будет медленней вложенного запроса.
31 Jaap Vduul
 
30.07.13
13:06
(30)
Вложенный запрос оптимизатор запросов может развернуть в запрос без оного.
32 NS
 
30.07.13
13:10
(31) Но фильтрация в вложенном запросе без вычисляемой колонки в select - гарантирует от ошибки.
33 NS
 
30.07.13
13:16
select avans, to_number(avans)
from (
select al.avans from avans al where al.avans='3.00' )
34 sda553
 
30.07.13
13:23
(29) не получится, у меня девятка еще
(33) Та же ошибка что и на последнем скрине
35 cincout
 
30.07.13
13:24
36 NS
 
30.07.13
13:27
(35) Это уже давно всем понятно. Вопрос как заставить оракл вычислять выражение в select после where, а не до.
37 NS
 
30.07.13
13:28
(34) А так
case
    when a1.avans='3.00'
        then to_number(a1.avans)
end
38 Jaap Vduul
 
30.07.13
13:30
(34)Я предупреждал.
39 Jaap Vduul
 
30.07.13
13:31
(34)
>> не получится, у меня девятка еще
Не понял, что за девятка?
40 sda553
 
30.07.13
13:35
(39) 9-ый оракл, на нем не работаю эти ваши новомодные regexp_like
(37) Тот же самый инвалид нумбер
41 NS
 
30.07.13
13:37
(40) А вот это уже совсем непонятно.
42 NS
 
30.07.13
13:38
(40) А полностью запрос как выглядит с case?
43 sda553
 
30.07.13
13:39
(42)
select  trim(a1.avans),
case
    when a1.avans='3.00'
        then to_number(a1.avans)
        else
        0
end
from
avans a1
where a1.avans='3.00';
44 sda553
 
30.07.13
13:42
выгрузил всю колонку в ексель - ексель уверен, что это все числа в колонках.
45 упс
 
30.07.13
13:43
а если to_number(trim(a1.avans))?
46 sda553
 
30.07.13
13:44
(45) уже даже nvl(trim пробовал
47 sda553
 
30.07.13
13:45
(45) А так же вариант where a1.avans='3.00' and length(a1.avans)=4
48 NS
 
30.07.13
13:47
(47) А колонка в sql числовая или строковая?
49 упс
 
30.07.13
13:47
(47) а to_number(avans, '999.99')?
50 sda553
 
30.07.13
13:49
(48) Строковая NVARCHAR2(100 CHAR)
(49) хм, помогло, слушай, спасибо
51 sda553
 
30.07.13
13:50
(49) а что второй параметр значит? И в чем была загвоздка?
52 упс
 
30.07.13
13:53
(51) Второй параметр - это формат http://www.techonthenet.com/oracle/functions/to_number.php. В чём была загвоздка - фиг его знает, я оракл в глаза не видел).
53 mistеr
 
31.07.13
07:54
(52) Загвоздка в NLS параметрах сессии.

(51) Кто у вас там такой умный придумал числа хранить как строки? Оторвать бы ему кое-что...
54 sda553
 
31.07.13
09:58
(53) Фиг знает, другое дело, что это не очень помогло.
У меня в sql клиенте я все подогнал, а сайт все равно со всеми изменениями вываливает трейс с этой ошибкой.

Вопрос? IIS+сайт+оракл - где крутить?
55 mistеr
 
31.07.13
21:39
(54) Крути таблицу. Поменяй тип данных в столбце.