powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML получить предпоследнее значение
16 сообщений из 16, страница 1 из 1
XML получить предпоследнее значение
    #39962226
AVP2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Подскажите, как получить предыдущее от максимального значения из набора? Может есть какой-нибудь реверс?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
select row_index_value, row_value
                 from xmltable(  '/rs/*'
                                 passing xmltype('<rs><r>'||replace('field_1;field_2;field_3;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
                                 columns
                                   row_index_value for ordinality
                                  ,row_value varchar2(4000) path '.'
                              ) x --order by x.row_index_value desc


из данного набора получить строку со значением индекса 5 (т.е. максимальный 6 минус 1) ?

Спасибо!
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962240
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
regexp_substr(str,'([^;]+);[^;]+$',1,1,null,1)




Код: plsql
1.
2.
3.
4.
5.
6.
with t as (
           select  'field_1;field_2;field_3;field_4;field_5;field_6' str from  dual
          )
select  regexp_substr(str,'([^;]+);[^;]+$',1,1,null,1) one_before_last
  from  t
/



SY.
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962247
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AVP2012,

Код: plsql
1.
2.
...
 order by x.row_index_value desc offset 1 rows fetch next 1 row only;
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962253
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а я то подумал, что надо решить средствами хмл (FLWOR)

....
stax
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962254
AVP2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Все получилось
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962291
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
а я то подумал, что надо решить средствами хмл (FLWOR)


A зачем сюда лепить XML? Тут в приципе и INSTR + SUBSTR достаточно просто с REGEXP_SUBSTR буковок меньше, но если производительность важна, то INSTR + SUBSTR куда быстрее REGEXP_SUBSTR.

Тут еще путаница в показаниях. Похоже афтар не понимает разницу между "предыдущее от максимального" и предпоследнее значениe. Так что неясно что надо вернуть для 'field_3;field_2;field_6;field_5;field_4;field_1'.

SY.
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962337
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Stax
а я то подумал, что надо решить средствами хмл (FLWOR)


A зачем сюда лепить XML?
...

SY.


для лучего освоения/понимания хмл

для решения простой задачки "т.е. максимальный 6 минус 1"
почему-то данные на хмл

вот я и надумал что надо похожими средствами решать

.....
stax
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962418
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Похоже афтар не понимает разницу между предыдущее от максимального, второе по убыванию и предпоследнее значение. Так что тут не ясно что необходимо вернуть для 'field_5;field_3;field_1;field_6;field_2;field_4' - field_2 (предпоследнее), field_5 (второе по убыванию) или field_1 (предыдущее от максимального)? Я решил что требуется предпоследнее. Для второе по убыванию и для предыдущее от максимального можно и через FLWOR.

SY.
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962666
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY

требуется предпоследнее ... и через FLWOR.

SY.


сортировка задается "порядком" в хмл

.....
stax
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962810
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
FLWOR:
предыдущее по порядку в ноде перед максимальным
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select row_index_value, row_value
                 from xmltable(  '/rs/r[index-of(/rs/r,fn:max(/rs/r/substring(.,0)))-1]'
                                 passing xmltype('<rs><r>'||replace('field_1;field_2;field_7;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
                                 columns
                                   row_index_value for ordinality
                                  ,row_value varchar2(4000) path '.'
                              ) x;

тут странно что не работает просто fn:max(/rs/r/text())

предыдущее по значению в ноде перед максимальным
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select row_index_value, row_value
                 from xmltable(  '(for $r in (/rs/r[text() ne ""]) order by $r descending return $r)[2]'
                                 passing xmltype('<rs><r>'||replace('field_1;field_2;field_7;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
                                 columns
                                   row_index_value for ordinality
                                  ,row_value varchar2(4000) path '.'
                              ) x;

а тут, к сожалению, выяснилось что оракл не поддерживает функцию sort
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962814
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

я так сделал (стеснялся сразу запостить)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t as (
select xmltype('<rs><r>'||replace('field_1;field_2;field_3;field_4;field_5;',';' ,'</r><r>')||'</r></rs>') xx from dual)
select 
  value
from t,xmltable(  
'
  let $L := rs/r
  let $C :=count($L)
  for $F at $I in $L
  where ($I = $C - 1)
  return <x>{$F}</x>
'
 passing xx
 columns
 value varchar2(20) path '.'
) x 
--order by 

SQL> /

VALUE
--------------------
field_5




....
stax
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962825
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Stax,

у тебя же нет вычисления максимума. а просто возврашать предпоследнее легче уж так: reverse(/rs/r)[2]
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select row_index_value, row_value
                 from xmltable(  'reverse(/rs/r)[2]'
                                 passing xmltype('<rs><r>'||replace('field_1;field_2;field_7;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
                                 columns
                                   row_index_value for ordinality
                                  ,row_value varchar2(4000) path '.'
                              ) x;

...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962831
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
FLWOR:
1)
предыдущее по порядку в ноде перед максимальным
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select row_index_value, row_value
                 from xmltable(  '/rs/r[index-of(/rs/r,fn:max(/rs/r/substring(.,0)))-1]'
                                 passing xmltype('<rs><r>'||replace('field_1;field_2;field_7;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
                                 columns
                                   row_index_value for ordinality
                                  ,row_value varchar2(4000) path '.'
                              ) x;

тут странно что не работает просто fn:max(/rs/r/text())

2)
предыдущее по значению в ноде перед максимальным
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select row_index_value, row_value
                 from xmltable(  '(for $r in (/rs/r[text() ne ""]) order by $r descending return $r)[2]'
                                 passing xmltype('<rs><r>'||replace('field_1;field_2;field_7;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
                                 columns
                                   row_index_value for ordinality
                                  ,row_value varchar2(4000) path '.'
                              ) x;

а тут, к сожалению, выяснилось что оракл не поддерживает функцию sort

спасибо

в 11 версии
1) слетел с
ERROR at line 1:
ORA-03113: end-of-file on communication channel


2)
задачка не "перед максимальным", а предпоследний в хмл-е
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  1  select row_index_value, row_value
  2                   from xmltable(  '(for $r in (/rs/r[text() ne ""]) order by $r descending return $r)[2]'
  3                                   passing xmltype('<rs><r>'||replace('field_1;field_8;field_7;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
  4                                   columns
  5                                     row_index_value for ordinality
  6                                    ,row_value varchar2(4000) path '.'
  7*                               ) x
SQL> /

ROW_INDEX_VALUE ROW_VALUE
--------------- --------------------
              1 field_7


надо field_5
.....
stax
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962834
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Stax,

у тебя же нет вычисления максимума. а просто возврашать предпоследнее легче уж так: reverse(/rs/r)[2]
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select row_index_value, row_value
                 from xmltable(  'reverse(/rs/r)[2]'
                                 passing xmltype('<rs><r>'||replace('field_1;field_2;field_7;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
                                 columns
                                   row_index_value for ordinality
                                  ,row_value varchar2(4000) path '.'
                              ) x;


спасибо
не подумал/призабыл о reverse, поэтому и начал городить ...
я именно хотел передпоследнее в хмл (не по значению)
22140282

.....
stax
...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962869
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Stax
в 11 версии
workaround для 11й версии
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select row_index_value, row_value
                 from xmltable(  'let $m := max(/rs/r/xs:string(.))
                                  let $i := index-of(/rs/r, $m) - 1
                                  return /rs/r[$i]'
                                 passing xmltype('<rs><r>'||replace('field_1;field_2;field_7;field_4;field_5;',';' ,'</r><r>')||'</r></rs>')
                                 columns
                                   row_index_value for ordinality
                                  ,row_value varchar2(4000) path '.'
                              ) x;

...
Рейтинг: 0 / 0
XML получить предпоследнее значение
    #39962892
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Stax
в 11 версии

workaround для 11й версии

1) max не один min/max?
2) предыдущий по позиции, не по значению

....
stax
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML получить предпоследнее значение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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