|
Специалисты по 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) Крути таблицу. Поменяй тип данных в столбце.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |