powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / lead c where
25 сообщений из 25, страница 1 из 1
lead c where
    #39576521
dar3000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select ord, name, dat, nw, dw, w1, w2 from (
select ord, name, dat, nw, dw,
  to_number(case when instr(nw,'/')>0 then substr(nw,instr(nw,'/')+1) else '0' end) as w1,
  to_number(case when instr(dw,'/')>0 then substr(dw,instr(dw,'/')+1) else '0' end) as w2
  from (select s.ord, s.name, d.dat, wind_napr_t_txt as nw, lead (wind_napr_y_txt) over (partition by stancia order by dat) as dw
    from data d, stancia s 
    where d.stancia=s.id)
  where to_char(dat,'yyyy')='2017')
where w1>0
order by ord, dat;



выдает ошибку: ORA-01722: неверное число.
Если убираю последний where, ошибки нет. Также ошибки нет, если убрать lead. Что не так в запросе, как разрешить ситуацию?
Причем, в where вызывает ошибку обращение к w1 или w2.

Полное сообщение об ошибке:
ORA-12801: ошибка в сервере P008 параллельного запроса
ORA-01722: неверное число
12801. 00000 - "error signaled in parallel query server %s"
*Cause: A parallel query server reached an exception condition.
*Action: Check the following error message for the cause, and consult
your error manual for the appropriate action.
*Comment: This error can be turned off with event 10397, in which
case the server's actual error is signaled instead.
...
Рейтинг: 0 / 0
lead c where
    #39576524
dar3000,

w1 у тебя - строка. Вот и сравнивай со строкой, а не с числом...

Код: plsql
1.
where w1 > '0'
...
Рейтинг: 0 / 0
lead c where
    #39576531
dar3000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как же
Код: sql
1.
 to_number(...) as w1 

?
...
Рейтинг: 0 / 0
lead c where
    #39576540
dar3000,

убери последний where, но оставь LEAD, и выполни полный фетч результата запроса. Ошибка есть или нет?
убери LEAD, но оставь последний where, и выполни полный фетч результата запроса. Ошибка есть или нет?

Возможно, без LEAD-а или WHERE запрос при НЕполном фетче просто не успевает дойти до проблемных данных. Выплевывает тебе первую порцию "нормальных" данных и затихает...
добавление в запрос LEAD-а или WHERE - меняет план запроса и проблемные данные успевают подтянуться...
...
Рейтинг: 0 / 0
lead c where
    #39576550
dar3000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я все урезал до одной строки (дополнительные условия к году).
...
Рейтинг: 0 / 0
lead c where
    #39576551
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dar3000,

За качество данных ручаешься?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with data as (select date '2017-07-02' dat, 1 stancia, 'severnyj/1000' wind_napr_y_txt,  'yuzhnyj/30' wind_napr_t_txt from dual
              union all
              select date '2017-07-01' dat, 1 stancia, 'vostochnyj/800' wind_napr_y_txt,  'zapadlyj/30' wind_napr_t_txt from dual
              --union all
              --select date '2017-06-30' dat, 1 stancia, 'vostochnyj/800' wind_napr_y_txt,  'nizhnij//30' wind_napr_t_txt from dual
              ),
    stancia as (select 1 id, 25 ord, 'Chernomordskaya' name from dual)
select ord, name, dat, nw, dw, w1, w2 from (
select ord, name, dat, nw, dw,
  to_number(case when instr(nw,'/')>0 then substr(nw,instr(nw,'/')+1) else '0' end) as w1,
  to_number(case when instr(dw,'/')>0 then substr(dw,instr(dw,'/')+1) else '0' end) as w2
  from (select s.ord, s.name, d.dat, wind_napr_t_txt as nw, lead (wind_napr_y_txt) over (partition by stancia order by dat) as dw
    from data d, stancia s 
    where d.stancia=s.id)
  where to_char(dat,'yyyy')='2017')
where w1>0
order by ord, dat;
...
Рейтинг: 0 / 0
lead c where
    #39576555
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

Изменение плана при устранении WINDOW также можно на этом кейсе посмотреть.
...
Рейтинг: 0 / 0
lead c where
    #39576564
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
план без lead, с where и раскоментированным union all
11.2.0.4

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 833982229

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     3 |    54 |     9  (12)| 00:00:01 |
|   1 |  SORT ORDER BY   |      |     3 |    54 |     9  (12)| 00:00:01 |
|   2 |   NESTED LOOPS   |      |     3 |    54 |     8   (0)| 00:00:01 |
|   3 |    FAST DUAL     |      |     1 |       |     2   (0)| 00:00:01 |
|   4 |    VIEW          |      |     3 |    54 |     6   (0)| 00:00:01 |
|   5 |     UNION-ALL    |      |       |       |            |          |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|   6 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|   7 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|*  8 |      FILTER      |      |       |       |            |          |
|   9 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   8 - filter(TO_NUMBER(CASE  WHEN 8>0 THEN '/30' ELSE '0' END )>0)


Очаровательно.
...
Рейтинг: 0 / 0
lead c where
    #39576569
dar3000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envЗа качество данных ручаешься?
Всех данных? Конечно, не ручаюсь - их достаточно много, чтобы все глазами просмотреть. Но я вывожу запросом одну строку (формально две так как используется lead). Эту строку я вижу - ничего особенного. w1 и w2 отформатированы как числа (выравнены вправо). Могу вывести строку со следующей пустой (null). Значения null обрабатываются как обычно и с тем же результатом.
...
Рейтинг: 0 / 0
lead c where
    #39576577
dar3000,

Как ты не поймешь. Дело не в том, сколько и каких строк попадает в итоговую выборку. Дело в том - сколько и каких строк, а главное -
в каком "физическом" порядке - обрабатывается ДО того, как вернуть тебе в выборку твои две строки.
...
Рейтинг: 0 / 0
lead c where
    #39576580
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dar3000Конечно, не ручаюсь - их достаточно много, чтобы все глазами просмотретьНичего, привыкай. Тренируй глаза. Я вот уже поднаторел, за час миллион строк глазками просмотреть успеваю.
...
Рейтинг: 0 / 0
lead c where
    #39576592
dar3000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давайте разберем досканально:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select ord, name, dat, nw, dw, w1, w2 from (
select ord, name, dat, nw, dw,
  to_number(case when instr(nw,'/')>0 then substr(nw,instr(nw,'/')+1) else '0' end) as w1,
  to_number(case when instr(dw,'/')>0 then substr(dw,instr(dw,'/')+1) else '0' end) as w2
  from (select s.ord, s.name, d.dat, wind_napr_t_txt as nw, lead (wind_napr_y_txt) over (partition by stancia order by dat) as dw
    from data d, stancia s 
    where d.stancia=s.id)
  where to_char(dat,'yyyy')='2017' and to_char(dat,'mm')='12' and to_char(dat,'dd')='27')

order by ord, dat;


Этот запрос работает - результат 1 строка. Фактически верхний селект в данном случае лишний. Но мне надо выбрать из этого результата значения с w1>0 (не важно будет возвращена строка или нет).
Ставлю условие where w1>0:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select ord, name, dat, nw, dw, w1, w2 from (
select ord, name, dat, nw, dw,
  to_number(case when instr(nw,'/')>0 then substr(nw,instr(nw,'/')+1) else '0' end) as w1,
  to_number(case when instr(dw,'/')>0 then substr(dw,instr(dw,'/')+1) else '0' end) as w2
  from (select s.ord, s.name, d.dat, wind_napr_t_txt as nw, lead (wind_napr_y_txt) over (partition by stancia order by dat) as dw
    from data d, stancia s 
    where d.stancia=s.id)
  where to_char(dat,'yyyy')='2017' and to_char(dat,'mm')='12' and to_char(dat,'dd')='27')
where w1>0
order by ord, dat;


Получаю ошибку.
Я предполагаю, что оракл сначала выполняет подзапрос, а потом к результату применяет условие выборки. Разве я не прав? Ведь условие выборки зависит от преобразований подзапроса.
w1 можно заменить на ord ошибка исчезает - все работает.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select ord, name, dat, nw, dw, w1, w2 from (
select ord, name, dat, nw, dw,
  to_number(case when instr(nw,'/')>0 then substr(nw,instr(nw,'/')+1) else '0' end) as w1,
  to_number(case when instr(dw,'/')>0 then substr(dw,instr(dw,'/')+1) else '0' end) as w2
  from (select s.ord, s.name, d.dat, wind_napr_t_txt as nw, lead (wind_napr_y_txt) over (partition by stancia order by dat) as dw
    from data d, stancia s 
    where d.stancia=s.id)
  where to_char(dat,'yyyy')='2017' and to_char(dat,'mm')='12' and to_char(dat,'dd')='27')
where ord>0
order by ord, dat;



Непонятно почему не могу использовать w1 или w2 без ошибки
...
Рейтинг: 0 / 0
lead c where
    #39576595
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dar3000а потом к результату применяет условие выборки. Разве я не прав?
Не прав.
Посмотри на план, получившийся для примера. Предикат мало того, что протолкнут внутрь, так ещё и сразу выставлен по значениям. Оптимизатор порой бывает излишне умным.

Покажи планы своих запросов для первых двух случаев. Если не знаешь как - ищи по dbms_xplan.
...
Рейтинг: 0 / 0
lead c where
    #39576597
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Код: plsql
1.
   8 - filter(TO_NUMBER(CASE  WHEN 8>0 THEN '/30' ELSE '0' END )>0)


Очаровательно.Какая-то попытка оптимизации в зависимости от значения литерала.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with data as (select date '2017-07-02' dat, 1 stancia, 'severnyj/1000' wind_napr_y_txt,  'yuzhnyj/30' wind_napr_t_txt from dual
              union all
              select date '2017-07-01' dat, 1 stancia, 'vostochnyj/800' wind_napr_y_txt,  'zapadlyj/30' wind_napr_t_txt from dual
              union all
              select date '2017-06-30' dat, 1 stancia, 'vostochnyj/800' wind_napr_y_txt,  'nizhnij//30' wind_napr_t_txt from dual
              ),
    stancia as (select 1 id, 25 ord, 'Chernomordskaya' name from dual)
select ord, name, dat, nw, /*dw,*/ w1/*, w2*/ from (
select ord, name, dat, nw,-- dw,
  to_number(case when instr(nw,'/')>0 then substr(nw,instr(nw,'/')+1) else '0' end) as w1
  --to_number(case when instr(dw,'/')>0 then substr(dw,instr(dw,'/')+1) else '0' end) as w2
  from (select s.ord, s.name, d.dat, wind_napr_t_txt as nw--, lead (wind_napr_y_txt) over (partition by stancia order by dat) as dw
    from data d, stancia s 
    where d.stancia=s.id)
  where to_char(dat,'yyyy')='2017')
where w1>0
order by ord, dat;

   8 - filter(TO_NUMBER(CASE  WHEN 8>0 THEN '/30' ELSE '0' END )>0)


Для варианта, когда в последней строке длина литерала больше
Код: plsql
1.
2.
3.
select date '2017-06-30' dat, 1 stancia, 'vostochnyj/800' wind_napr_y_txt,  'xyinizhnij//30' wind_napr_t_txt from dual

   8 - filter(TO_NUMBER(CASE  WHEN 11>0 THEN '/30' ELSE '0' END )>0)
...
Рейтинг: 0 / 0
lead c where
    #39576603
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dar3000Также ошибки нет, если убрать lead
Т,е. дать возможность оптимизатору протолкнуть все предикаты на самый низкий уровень.

Твоя проблема возникает при проталкивании предиката по to_number(case ..) >0 ниже, чем предиката to_char(dat..) = ... .

Что говорит о кривых данных в поле nw.
...
Рейтинг: 0 / 0
lead c where
    #39576604
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

*nw = wind_napr_t_txt
...
Рейтинг: 0 / 0
lead c where
    #39576609
dar3000,

добавь уже rownum >= 0 во все WHERE всех подзапросов и спи себе дальше до следующего "взрыва"....
...
Рейтинг: 0 / 0
lead c where
    #39576615
dar3000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envНе прав.

Хорошо, пусть не прав.
Может косяк в данных. Но есть два аргумента как бы против этой версии:
1. Убираю lead, ошибки нет, хотя данные остались те же - обрабатываются нормально.
2. условие с ord - данные те же обрабатываются нормально

Есть и третий аргумент: Один из "противоречивых" скриптов должен выполняться, но оба дают ошибку:
Код: sql
1.
2.
3.
...
where w1 is not null
...



Код: sql
1.
2.
3.
...
where w1 is null
...


тут уже не важно какие данные. Или я снова не прав?
...
Рейтинг: 0 / 0
lead c where
    #39576636
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dar3000,

Ну как по мне, ORA-01722: неверное число. - это из-за to_number(

Посему предлагаю его упразнить

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select ord, name, dat, nw, dw, w1,
  case when instr(dw,'/')>0 then substr(dw,instr(dw,'/')+1) else '0' end as w2
  from (select s.ord, s.name, d.dat, 
          case when instr(wind_napr_t_txt,'/')>0 then substr(wind_napr_t_txt,instr(wind_napr_t_txt,'/')+1) else '0' end as w1, -- если так кейсы любите
          lead (wind_napr_y_txt) over (partition by stancia order by dat) as dw
          from data d, stancia s 
         where d.stancia=s.id) k
  where to_char(dat,'yyyy')='2017'
    and w1>'0'
order by ord, dat;



если нет данных типа .1 а есть типа 0.1 то все пройдет пучком

ORA-01722 видел при конвертации разделителей чисел ...
...
Рейтинг: 0 / 0
lead c where
    #39576651
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

Даже думаю стоит добавить Trim или Ltrim

Код: plsql
1.
Trim(substr(wind_napr_t_txt,instr(wind_napr_t_txt,'/')+1))
...
Рейтинг: 0 / 0
lead c where
    #39576732
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dar3000Или я снова не прав?
Ты просто не понял что тебе написали. Правота тут ни при чём.

Для тупых нежелающих думать.

На входе корзина с белыми кубиками, красными кубиками и красными шариками.
Задача - впихнуть красные шарики из корзины в круглое отверстие.

Варианты:
0. Выбрать всё красное, начать впихивать, упасть с ошибкой на невпихуемости в отверстие. (твой случай)
1. Выбрать все шарики - надо же, впихиваются! Проверить на красноту.
2. Выбрать шарики, проверить на красноту, впихнуть в отверстие.
3. .....

Каждый из этих вариантов - стадия применения шага FILTER.

dar3000Может косяк в данных. Но есть два аргумента как бы против этой версии
Есть только один аргумент против этой версии - проверить данные. Если есть хотя бы одно данное, нарушающее формат - прибивать гвоздями предикаты или навешивать дополнительные условия.
...
Рейтинг: 0 / 0
lead c where
    #39576738
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

я тупой
select * from t where par_type='N' and par_value=132

гарантірую что для par_type='N' par_value токо чісла
от плана завісіт
....
stax
...
Рейтинг: 0 / 0
lead c where
    #39576756
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax, зачем ты все время меняешь раскладку, когда пишешь? не удобно же читать.
...
Рейтинг: 0 / 0
lead c where
    #39576763
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

В случае ТС, в зависимости от возможности протолкнуть предикат, твой запрос превращается в
Код: plsql
1.
select * (select * from t where par_type='N' and rownum >=0) where par_value=132


Код: plsql
1.
select * (select * from t where par_value=132 and rownum>=0) where par_type='N')
...
Рейтинг: 0 / 0
lead c where
    #39576764
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,
*
Код: plsql
1.
 select * FROM 
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / lead c where
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]