Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как обеспечить сортировку в столбце из букв и цифр?  [new]
Roman Schepalov
Member

Откуда: Spb
Сообщений: 67
SQL> select post_indication from alarm_post order by post_indication;

POST_INDICATION
--------------------
ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 13
ГПЗ 14
ГПЗ 15
ГПЗ 9

7 rows selected

SQL> alter session set nls_sort=Russian;

Session altered

SQL> select post_indication from alarm_post order by post_indication;

POST_INDICATION
--------------------
ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 13
ГПЗ 14
ГПЗ 15
ГПЗ 9

7 rows selected

SQL>  alter session set nls_comp=ANSI;

Session altered

SQL> select post_indication from alarm_post order by post_indication;

POST_INDICATION
--------------------
ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 13
ГПЗ 14
ГПЗ 15
ГПЗ 9

7 rows selected

SQL>  alter session set nls_comp=binary;

Session altered

SQL> select post_indication from alarm_post order by post_indication;

POST_INDICATION
--------------------
ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 13
ГПЗ 14
ГПЗ 15
ГПЗ 9

7 rows selected

SQL> 

Как сделать чтобы ГПЗ 9 стоял первым?
14 ноя 06, 09:34    [3395354]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Barmalei
Member

Откуда:
Сообщений: 83
Выделить из строки цифирки, и сортировать по to_number...
14 ноя 06, 09:41    [3395374]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
select post_indication 
  from alarm_post 
 order by lpad(post_indication , max(length(post_indication)) over(),'0');
14 ноя 06, 09:42    [3395379]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Roman Schepalov
Member

Откуда: Spb
Сообщений: 67
Щукина Анна
select post_indication 
  from alarm_post 
 order by lpad(post_indication , max(length(post_indication)) over(),'0');


Да, так работает. На 9.2.0.7. А вот на 8.1.5 будет работать или нет интересно, возможно проверить сейчас к сожалению нету.
14 ноя 06, 09:46    [3395397]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
__mike__
Member

Откуда: Белгород
Сообщений: 553
with t as (
select 'ÃÏÇ 10' str from dual
union all
select 'ÃÏÇ 11' str from dual
union all
select 'ÃÏÇ 9' str from dual
union all
select 'ÃÏÇ 12' str from dual
union all
select 'ÃÏÇ 15' str from dual
)
select str
from t
order by to_number(substr(str,4,length(str)))


Roman Schepalov
Щукина Анна
select post_indication 
  from alarm_post 
 order by lpad(post_indication , max(length(post_indication)) over(),'0');


Да, так работает. На 9.2.0.7. А вот на 8.1.5 будет работать или нет интересно, возможно проверить сейчас к сожалению нету.


а у меня не работает на 9.2.0.8
with t as (
select 'ÃÏÇ 10' str from dual
union all
select 'ÃÏÇ 11' str from dual
union all
select 'ÃÏÇ 9' str from dual
union all
select 'ÃÏÇ 12' str from dual
union all
select 'ÃÏÇ 15' str from dual
)
select str
from t
order by lpad(str , max(length(str)) over(),'0');


ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 15
ГПЗ 9
14 ноя 06, 09:51    [3395418]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Roman Schepalov
Щукина Анна
select post_indication 
  from alarm_post 
 order by lpad(post_indication , max(length(post_indication)) over(),'0');


Да, так работает. На 9.2.0.7. А вот на 8.1.5 будет работать или нет интересно, возможно проверить сейчас к сожалению нету.
Тоже будет работать.
Вот только я Вам не ту задачу решила...
Мне с какого-то перепугу показалось, что у вас там два поля VARCHAR2, в одном из которых храняться числовые данные.

Предложенное решение уже не будет работать, как только в таблице появятся данные вида 'ПЗ 9'.

Если у вас строки имеют строгий формат - вначале буквенная часть, затем числовая, то тогда лучше будет разделить это поле при сортировки на два: отдельно буквы, одтельно числа и затем уже сортировать.
14 ноя 06, 09:52    [3395425]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
__mike__
with t as (
select 'ÃÏÇ 10' str from dual
union all
select 'ÃÏÇ 11' str from dual
union all
select 'ÃÏÇ 9' str from dual
union all
select 'ÃÏÇ 12' str from dual
union all
select 'ÃÏÇ 15' str from dual
)
select str
from t
order by to_number(substr(str,4,length(str)))


Roman Schepalov
Щукина Анна
select post_indication 
  from alarm_post 
 order by lpad(post_indication , max(length(post_indication)) over(),'0');


Да, так работает. На 9.2.0.7. А вот на 8.1.5 будет работать или нет интересно, возможно проверить сейчас к сожалению нету.


а у меня не работает на 9.2.0.8
with t as (
select 'ÃÏÇ 10' str from dual
union all
select 'ÃÏÇ 11' str from dual
union all
select 'ÃÏÇ 9' str from dual
union all
select 'ÃÏÇ 12' str from dual
union all
select 'ÃÏÇ 15' str from dual
)
select str
from t
order by lpad(str , max(length(str)) over(),'0');


ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 15
ГПЗ 9
Именно потому и не работает, что не для такой задачи делалось.
14 ноя 06, 09:53    [3395434]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
__mike__
Member

Откуда: Белгород
Сообщений: 553
извините - писал тогда, когда вашего поста еще не было Картинка с другого сайта.
14 ноя 06, 09:54    [3395443]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
__mike__
with t as (
select 'ÃÏÇ 10' str from dual
union all
select 'ÃÏÇ 11' str from dual
union all
select 'ÃÏÇ 9' str from dual
union all
select 'ÃÏÇ 12' str from dual
union all
select 'ÃÏÇ 15' str from dual
)
select str
from t
order by to_number(substr(str,4,length(str)))


Roman Schepalov
Щукина Анна
select post_indication 
  from alarm_post 
 order by lpad(post_indication , max(length(post_indication)) over(),'0');


Да, так работает. На 9.2.0.7. А вот на 8.1.5 будет работать или нет интересно, возможно проверить сейчас к сожалению нету.


а у меня не работает на 9.2.0.8
with t as (
select 'ÃÏÇ 10' str from dual
union all
select 'ÃÏÇ 11' str from dual
union all
select 'ÃÏÇ 9' str from dual
union all
select 'ÃÏÇ 12' str from dual
union all
select 'ÃÏÇ 15' str from dual
)
select str
from t
order by lpad(str , max(length(str)) over(),'0');


ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 15
ГПЗ 9


Кстати, вот так попробуйте:
with t as (
select 'ÃÏÇ 10' str from dual
union all
select 'ÃÏÇ 11' str from dual
union all
select 'ÃÏÇ 9' str from dual
union all
select 'ÃÏÇ 12' str from dual
union all
select 'ÃÏÇ 15' str from dual
)
select str
from t
order by translate(str,chr(0)||'1234567890',chr(0)),
         to_number(translate(str, '1'||translate(str,chr(0)||'1234567890',chr(0)), '1'))
14 ноя 06, 09:56    [3395453]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Roman Schepalov
Member

Откуда: Spb
Сообщений: 67
Ну т.к. символьная часть меняться не будет, то решение вполне приемлемо :)
14 ноя 06, 10:03    [3395499]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Roman Schepalov
Member

Откуда: Spb
Сообщений: 67
QL> alter session set nls_sort=Russian;

Session altered

SQL> 
SQL> with t as (
  2  select 'ГПЗ 10' str from dual
  3  union all
  4  select 'ГПЗ 11' str from dual
  5  union all
  6  select 'ГПЗ 9' str from dual
  7  union all
  8  select 'ГПЗ 12' str from dual
  9  union all
 10  select 'ГПЗ 15' str from dual
 11  )
 12  select str
 13  from t
 14  order by lpad(str , max(length(str)) over(),'0');

STR
------
ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 15
ГПЗ 9

SQL> alter session set nls_sort=binary;

Session altered

SQL> 
SQL> with t as (
  2  select 'ГПЗ 10' str from dual
  3  union all
  4  select 'ГПЗ 11' str from dual
  5  union all
  6  select 'ГПЗ 9' str from dual
  7  union all
  8  select 'ГПЗ 12' str from dual
  9  union all
 10  select 'ГПЗ 15' str from dual
 11  )
 12  select str
 13  from t
 14  order by lpad(str , max(length(str)) over(),'0');

STR
------
ГПЗ 9
ГПЗ 10
ГПЗ 11
ГПЗ 12
ГПЗ 15

SQL> 
14 ноя 06, 10:05    [3395528]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Roman Schepalov
QL> alter session set nls_sort=Russian;


А чтобы не дергать явно NLS-параметры сессии можно написать вот так:
alter session set nls_sort = russian;
with t as (
    select 'ГПЗ 10' str from dual
    union all
    select 'ГПЗ 11' str from dual
    union all
    select 'ГПЗ 9' str from dual
    union all
    select 'ГПЗ 12' str from dual
    union all
   select 'ГПЗ 15' str from dual
   )
   select str
   from t
   order by nlssort(lpad(str , max(length(str)) over(),'0'),'NLS_SORT = BINARY');
14 ноя 06, 10:12    [3395577]     Ответить | Цитировать Сообщить модератору
 Re: Как обеспечить сортировку в столбце из букв и цифр?  [new]
Roman Schepalov
Member

Откуда: Spb
Сообщений: 67
Щукина Анна
Roman Schepalov
QL> alter session set nls_sort=Russian;


А чтобы не дергать явно NLS-параметры сессии можно написать вот так:
alter session set nls_sort = russian;
with t as (
    select 'ГПЗ 10' str from dual
    union all
    select 'ГПЗ 11' str from dual
    union all
    select 'ГПЗ 9' str from dual
    union all
    select 'ГПЗ 12' str from dual
    union all
   select 'ГПЗ 15' str from dual
   )
   select str
   from t
   order by nlssort(lpad(str , max(length(str)) over(),'0'),'NLS_SORT = BINARY');


Да так вообще красиво :) Спасибо, приятно получить квалифицированную помощь так быстро и так адекватно :)
14 ноя 06, 10:16    [3395606]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить