Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сортировка данных внутри строки / 16 сообщений из 16, страница 1 из 1
20.01.2022, 20:56
    #40128224
Gramkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка данных внутри строки
Добрый день, имеется таблица с полями ID, SUCCESS_DAYS.
В поле SUCCESS_DAYS присутствуют данные следующего вида: '04,02,01,03'.
Подскажите, каким образом можно отсортировать данные в строках, таким образом, чтобы они имели следующий вид: '01,02,03,04'?
...
Рейтинг: 0 / 0
20.01.2022, 21:49
    #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
21.01.2022, 10:48
    #40128332
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка данных внутри строки
Asmodeus

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

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

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


не понял

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

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

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

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

.....
stax


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


не понял

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


....
stax

Чего "не понял"? желательно быть предсказуемым
...
Рейтинг: 0 / 0
21.01.2022, 12:51
    #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
21.01.2022, 13:27
    #40128395
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка данных внутри строки
Gramkin
В поле SUCCESS_DAYS присутствуют данные следующего вида: '04,02,01,03'
как вы собираетесь вообще с этим работать? Каждый раз парсить и конкатенировать туда-сюда? Не проще было сделать битовую маску(31 день как раз хорошо влезет в 2 байта) или хотя бы varray?
...
Рейтинг: 0 / 0
21.01.2022, 13:30
    #40128396
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка данных внутри строки
Владимир СА

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


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

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

пример 1?

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

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


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

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

пример 1?

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

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


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

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

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

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

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

???
...
Рейтинг: 0 / 0
21.01.2022, 14:17
    #40128414
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка данных внутри строки
Stax
а так да, конечно,
в древнем коде может запросто вылезти (по сути мина)
.....
stax
да версия оракла 11g
...
Рейтинг: 0 / 0
21.01.2022, 14:21
    #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
21.01.2022, 14:22
    #40128418
SY
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сортировка данных внутри строки / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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