Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Сортировка строки как числа  [new]
OlleUp
Member

Откуда: Хабаровск
Сообщений: 134
Никак не могу придумать как сделать такую штуку:
1. Есть строковое поле.
2. В нем содержатся цифры.
3. Могут содержаться не только цифры но и символы, любые.

Вопрос - как отсортировать по этому полю в режиме сортировки числа.
Т.е. например
Строковая сортировка:
0004
001
0010
Числовая сортировка:
001
0004
0010

to_number и cast не предлагать - в строку могут содержатся (и содержатся) символы и в этом случае возникает исключение при выполнении запроса.
как бы вот заменить все символы не являющиеся цифрами на скажем 0.
есть такая функция как translate, но в этом случае надо УКАЗАТЬ явно все символы, не являющиеся цифрами, что трудоемко.
как есть еще варианты ?
2 июн 05, 10:13    [1590424]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29123
OlleUp
to_number и cast не предлагать - в строку могут содержатся (и содержатся) символы и в этом случае возникает исключение при выполнении запроса.
как бы вот заменить все символы не являющиеся цифрами на скажем 0.
есть такая функция как translate, но в этом случае надо УКАЗАТЬ явно все символы, не являющиеся цифрами, что трудоемко.
как есть еще варианты ?
order by decode(translate(some_column, '_0123456789', '_'), null, to_number(some_column)), some_column
2 июн 05, 10:19    [1590447]     Ответить | Цитировать Сообщить модератору
 не работает  [new]
OlleUp
Member

Откуда: Хабаровск
Сообщений: 134
не работает
как то странно сортирует.
вообще непонятно в каком порядке
2 июн 05, 10:28    [1590488]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
OlleUp
Member

Откуда: Хабаровск
Сообщений: 134
Elic
order by decode(translate(some_column, '_0123456789', '_'), null, to_number(some_column)), some_column


Это выражение возвращает NULL для всех строк
2 июн 05, 10:33    [1590508]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29123
OlleUp
Это выражение возвращает NULL для всех строк
select some_column, decode(translate(some_column, '_0123456789', '_'), null, to_number(some_column)) as num
  from
  ( select '0004' as some_column from dual union all
    select '001'  as some_column from dual union all
    select '0010' as some_column from dual union all
    select 'abcd' as some_column from dual union all
    select '1a2b' as some_column from dual union all
    select '132'  as some_column from dual
  )
  order by decode(translate(some_column, '_0123456789', '_'), null, to_number(some_column)), some_column;

SOME           NUM
---- -------------
001              1
0004             4
0010            10
132            132
1a2b
abcd
2 июн 05, 10:42    [1590558]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Sergey Balter
Member

Откуда: Ruppiner Land
Сообщений: 1006
order by lpad(your_field, 50)
2 июн 05, 10:42    [1590561]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Sergey Balter
Member

Откуда: Ruppiner Land
Сообщений: 1006
или
order by lpad(your_field, 50, '0')
2 июн 05, 10:43    [1590568]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Troglodyte
Member

Откуда:
Сообщений: 27
Если регулярные выражения есть в твоей версии СУБД, то можно привести все нецифры к пустой строке
order by to_number(REGEXP_REPLACE(column,'[^[:digit:]]',''))
2 июн 05, 10:44    [1590574]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
OlleUp
Member

Откуда: Хабаровск
Сообщений: 134
Sergey Balter
order by lpad(your_field, 50)

это не работает, точнее работает как обычная сортировка
2 июн 05, 10:47    [1590588]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
OlleUp
Member

Откуда: Хабаровск
Сообщений: 134
Elic
select some_column, decode(translate(some_column, '_0123456789', '_'), null, to_number(some_column)) as num
  from
  ( select '0004' as some_column from dual union all
    select '001'  as some_column from dual union all
    select '0010' as some_column from dual union all
    select 'abcd' as some_column from dual union all
    select '1a2b' as some_column from dual union all
    select '132'  as some_column from dual
  )
  order by decode(translate(some_column, '_0123456789', '_'), null, to_number(some_column)), some_column;

SOME           NUM
---- -------------
001              1
0004             4
0010            10
132            132
1a2b
abcd


Вот это работает, только с небольшой модификацией:
order by decode(translate(trim(kartnum), '_0123456789', '_'), null, to_number(trim(kartnum))), trim(kartnum)

БОЛЬШОЕ СПАСИБО !
2 июн 05, 10:49    [1590601]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сортировка строки как числа  [new]
SuperAdm
Member

Откуда: Ю-Сахалинск
Сообщений: 17
Подскажите как отсортировать единственное поле House, если это поле с номером дома и бывает с буквами после цифр.

select distinct House from Tabl order by ????????

а то не могу понять другие примеры..
28 фев 08, 09:56    [5347488]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
SuperAdm
а то не могу понять другие примеры..
Ну так разберитесь, чего там сложного?
28 фев 08, 10:00    [5347509]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17488
OlleUp
Sergey Balter
order by lpad(your_field, 50)

это не работает, точнее работает как обычная сортировка

Неправда ваша...
SQL> with tab as (select '0004' x
  2  from dual union all select '001'
  3  from dual union all select '0010'
  4  from dual)
  5  select * from tab order by lpad(x,50,'0');
 
X
----
001
0004
0010
 
SQL> 
Что делать в этой связи с буквами - Вам решать, можно вырезать translate, можно оставить "as is", можно придумать более подходящее правило.
28 фев 08, 10:02    [5347519]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Madness
Member

Откуда: Москва
Сообщений: 648
andrey_anonymous
Неправда ваша...

Думаете, за 3 года труп еще не остыл? :)
28 фев 08, 10:05    [5347543]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17488
Madness
andrey_anonymous
Неправда ваша...

Думаете, за 3 года труп еще не остыл? :)

Не оживлял - не мне и закапывать, тем более тут дамы :)
28 фев 08, 10:10    [5347570]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
SuperAdm
Member

Откуда: Ю-Сахалинск
Сообщений: 17
а если мне не понятно?.. (иначе бы я не спрашивал)
28 фев 08, 10:41    [5347787]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17488
SuperAdm
а если мне не понятно?.. (иначе бы я не спрашивал)

Нам тем более - приведите хотя бы пример исходных данных и желаемый результат сортировки
28 фев 08, 10:45    [5347808]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
SuperAdm
а если мне не понятно?.. (иначе бы я не спрашивал)
Ну так спрашивайте конкретно, что именно неясно?
28 фев 08, 10:51    [5347855]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
SuperAdm
Member

Откуда: Ю-Сахалинск
Сообщений: 17
Close
28 фев 08, 11:10    [5347998]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Madness
Member

Откуда: Москва
Сообщений: 648
SuperAdm
Close

Закопал обратно? :))
28 фев 08, 11:12    [5348017]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17488
Madness
SuperAdm
Close

Закопал обратно? :))

Привел пример данных :)
SQL> with tab as (select 'Close' str from dual union all select 'Open' from dual)
  2  select min(str) str, max(replace(sys_connect_by_path(s,' '),' ')) ord_str from (
  3  select row_number() over (partition by r_num order by rownum) r, s, str, r_num
  4  from ( select r_num, str, substr(str,r,1) s
  5           from (select rownum r_num, str from tab) tab
  6              , (select rownum r from (select max(length(str)) p from tab) connect by level <= p)
  7  order by r_num, substr(str,r,1)
  8  ) )
  9  start with r=1
 10  connect by prior r = r-1 and prior r_num=r_num
 11  group by r_num;
 
STR   ORD_STR
----- --------------------------------------------------------------------------------
Close Celos
Open  enOp
 
SQL> 
28 фев 08, 11:28    [5348170]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
SuperAdm
Member

Откуда: Ю-Сахалинск
Сообщений: 17
Придумал простой способ:
создать дополнительное поле, сделать процедуру его нумерации, и при вызове селекта указывать сортировку по этому полю..
29 фев 08, 02:23    [5352470]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
KAB
Member

Откуда: Владивосток
Сообщений: 44
У меня было подобное надо было сортировать по номеру дома и квартиры где возможны буквы и прочее - написал функцию где переводится to_number в число, при возникновении исключения оно обрабатывается(ищется первый с начала не цифровой символ и обрезается до него а затем в число) вроде все работает как надо.
29 фев 08, 03:34    [5352501]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
apps_funtik
Member

Откуда: Москва
Сообщений: 98
народ, а может быть все намного проще, если вот так:
alter session set NLS_SORT=BINARY
?
29 фев 08, 14:36    [5355174]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строки как числа  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
apps_funtik
народ, а может быть все намного проще, если вот так:
alter session set NLS_SORT=BINARY
?


Здесь регулярно появляются изобретатели вечного двигателя. Welcome to the club.

SQL> with t as (select '1' c from dual
  2  union all select '2' from dual
  3  union all select '11' from dual
  4  union all select '22' from dual
  5  )
  6  select * from t order by c;

C
--
1
11
2
22

SQL> alter session set nls_sort = BINARY;

Session altered.

SQL> with t as (select '1' c from dual
  2  union all select '2' from dual
  3  union all select '11' from dual
  4  union all select '22' from dual
  5  )
  6  select * from t order by c;

C
--
1
11
2
22
29 фев 08, 14:43    [5355235]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить