powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сортировка данных внутри строки
16 сообщений из 16, страница 1 из 1
Сортировка данных внутри строки
    #40128224
Gramkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, имеется таблица с полями ID, SUCCESS_DAYS.
В поле SUCCESS_DAYS присутствуют данные следующего вида: '04,02,01,03'.
Подскажите, каким образом можно отсортировать данные в строках, таким образом, чтобы они имели следующий вид: '01,02,03,04'?
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128238
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gramkin,

Разобрать на элементы, отсортировать, собрать обратно, если надо.

Например, так (при известных ограничениях).
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t(str) as
(select '02,04,03,01,05' from dual)
select listagg(val,',') within group (order by val) from
  (select regexp_substr (
           str,
           '[^,]+',
           1,
           level
         ) val
  from   t
  connect by level <= 
    length ( str ) - length ( replace ( str, ',' ) ) + 1
);
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128332
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Asmodeus

(при известных ограничениях).

какие ограничения?

.....
stax
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128344
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128348
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW


не понял

авторимеется таблица с полями ID, SUCCESS_DAYS .

....
stax
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128349
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Asmodeus

(при известных ограничениях).

какие ограничения?

.....
stax


известные(ц)
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128350
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SergiiW


не понял

авторимеется таблица с полями ID, SUCCESS_DAYS .


....
stax

Чего "не понял"? желательно быть предсказуемым
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128377
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SergiiW


не понял

авторимеется таблица с полями ID, SUCCESS_DAYS .


....
staxЧего непонятно...
listagg возвращает строку не более 4000 byte...
Если при использовании listagg вдруг будет строка более 4000 byte, то сгенерируется ошибка
Код: plsql
1.
ORA-01489: result of string concatenation is too long


Но в данном случае возможно этого не случится, т.к. дней в месяце максимум 31, т.е. строка скорее всего
Код: plsql
1.
'01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31'

длина 92 символа... Если конечно дни не повторяются...
А вот для того чтобы этого не получилось, скорее всего в скрипт предоставленный Asmodeus надо добавить distinct:
Код: plsql
1.
2.
3.
...
(select distinct regexp_substr (
...


То скрипт хороший.
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128395
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Gramkin
В поле SUCCESS_DAYS присутствуют данные следующего вида: '04,02,01,03'
как вы собираетесь вообще с этим работать? Каждый раз парсить и конкатенировать туда-сюда? Не проще было сделать битовую маску(31 день как раз хорошо влезет в 2 байта) или хотя бы varray?
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128396
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СА

Чего непонятно...


исходная строка поле в таблице

на каких данных сработают "известные ограничениям"?

пример 1?

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

Чего непонятно...


исходная строка поле в таблице

на каких данных сработают "известные ограничениям"?

пример 1?

.....
stax
Для текущего примера конечно согласен с тобой, определяется полем в таблице ...
Но у меня был случай, что при использовании listagg выдавало сообщение
Код: plsql
1.
ORA-01489: result of string concatenation is too long
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128406
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СА

Для текущего примера конечно согласен с тобой, определяется полем в таблице ...
Но у меня был случай, что при использовании listagg выдавало сообщение
Код: plsql
1.
ORA-01489: result of string concatenation is too long


я спрашивал о текущем конкретном случае

а так да, конечно,
в древнем коде может запросто вылезти (по сути мина), но не для даного случая

зы
в новых версиях добавили параметр

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

в новых версиях добавили параметр
....
stax
Про
Код: plsql
1.
ON OVERFLOW TRUNCATE...

???
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128414
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
а так да, конечно,
в древнем коде может запросто вылезти (по сути мина)
.....
stax
да версия оракла 11g
...
Рейтинг: 0 / 0
Сортировка данных внутри строки
    #40128416
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
При фиксированном ограниченном наборе дней (что скорее всего и есть) легко делается с помощью regexp_replace, см. STR5:
Just 4 fun
Код: 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.
27.
28.
with t(str) as
(select '02,04,03,01,05' from dual union all
 select '03,01,05' from dual union all
 select '07' from dual union all
 select '' from dual
)
select t.*
  ,(select listagg(to_char(x,'fm00'),',') within group(order by x) str2
    from json_table('['||t.str||']','$[*]' columns x path '$')) str2
  ,xmlcast(xmlquery('string-join(distinct-values(tokenize(concat(",",.),",")),",")' passing str returning content) as varchar2(100)) str3
  ,xmlcast(xmlquery('string-join((for $x in (tokenize(concat(",",.),",")[.]) order by $x return $x),",")' passing str returning content) as varchar2(100)) str4
  ,regexp_replace(
      '01,02,03,04,05,06,07,08,09'
     ,'(('||replace(nvl(t.str,'ZZ'),',','|')||')|\d\d),?'
     ,'\2'
     ) pre_str5
  ,regexp_replace(
       regexp_replace(
          '01,02,03,04,05,06,07,08,09'
         ,'(('||replace(nvl(t.str,'ZZ'),',','|')||')|\d\d),?'
         ,'\2'
       )
      ,'(\d\d)'
      ,',\1'
      ,3
     ) str5
from t     
/

Results
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> set null NULL
SQL> /

STR             STR2            STR3            STR4            PRE_STR5        STR5
--------------- --------------- --------------- --------------- --------------- ---------------
02,04,03,01,05  01,02,03,04,05  01,02,03,04,05  01,02,03,04,05  0102030405      01,02,03,04,05
03,01,05        01,03,05        01,03,05        01,03,05        010305          01,03,05
07              07              07              07              07              07
NULL            NULL            NULL            NULL            NULL            NULL

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with t(str) as
(select '02,04,03,01,05' from dual)
select  xmlquery(
                 'string-join(
                              for $e at $i in ora:tokenize(concat("0,",.),",")
                                where $i > 1
                                order by xs:integer($e)
                                return $e,
                              ","
                             )'
                 passing str
                 returning content
                ) x
  from  t
/

X
--------------------------------------------------------------------------------
01,02,03,04,05

SQL>



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


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