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

Откуда:
Сообщений: 84
таблица из одного столбца (zn):
8
0001
123
0002
A1

Необходимо выполнить сортировку, чтобы получилась следующая последовательность:
8
123
0001
0002
A1

Т.е. сначала перечисляются все числовые значения (как вариант order by length(zn), zn)
а потом все значения буквенные (опять же (как вариант order by length(zn), zn)).
Но надо добиться такого результата без использования union.

Может быть есть уже готовый nls_sort под такие задачи или какое-то решение?
25 сен 14, 09:45    [16619326]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
reaque
Member

Откуда:
Сообщений: 84
пока сделал так:
select zn,
case when substr(zn,1,1) in ('0','1','2','3','4','5','6','7','8','9')
then lpad(zn,20,'0') 
else lpad(zn,20,'9') 
end as zn2
order by zn2


может есть другие идеи?
25 сен 14, 10:32    [16619649]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
reaque
Member

Откуда:
Сообщений: 84
чтобы избежать проблем с '0'
при случае 0001 и 8 (0008) в первом lpad можно заменить на lpad(zn,12,'!')
25 сен 14, 10:35    [16619665]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
уувуукукуку
Guest
reaque,

regexp_*
d
25 сен 14, 10:38    [16619683]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
wtf63
Guest
reaque,

в вашем примере пройдёт order by length(regexp_replace(zn,'[A-Z]','9999')),zn
25 сен 14, 10:40    [16619696]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
Да ну
Member

Откуда: Первопрестольная
Сообщений: 242
reaque,

with q (val) as (
  select '8'    from dual union all
  select '0001' from dual union all
  select '123'  from dual union all
  select '0002' from dual union all
  select 'A1'   from dual
)
select val from q
order by nvl2(rtrim(val,'0123456789'),1,0), length(val), val
25 сен 14, 10:47    [16619749]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
Да ну, а если не 0001, а 001
25 сен 14, 11:03    [16619874]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
Да ну
Member

Откуда: Первопрестольная
Сообщений: 242
MonteCarlos,

И что?
reaque
Т.е. сначала перечисляются все числовые значения (как вариант order by length(zn), zn)
а потом все значения буквенные (опять же (как вариант order by length(zn), zn)).
25 сен 14, 11:28    [16620022]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
Да ну,
судя по результату, который привел автор - 001 и 0001 - это буквенные значения,
отработай запрос с 001, он окажется между 8 и 123
25 сен 14, 11:32    [16620051]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
Да ну
Member

Откуда: Первопрестольная
Сообщений: 242
MonteCarlos,

Ну если в алгебре автора '0' - это буква, тогда и 100 - тоже буквенное значение.
25 сен 14, 11:35    [16620084]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
Да ну,
даже если 001 - число (т.е. просто единица), то у него по любому получаются плохие соседи.
Надо дождаться уточнения автора.
25 сен 14, 11:39    [16620109]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
короче оба варианта если что

select * from  t
order by decode(regexp_count(zn, '(^[1-9][0-9]*$)|(^0$)'), 1, to_number(zn)), zn

select * from  t
order by decode(regexp_count(zn, '^[0-9]+$'), 1, to_number(zn)), zn
25 сен 14, 13:47    [16620926]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
MonteCarlos
короче оба варианта если что
Короче, они у тебя вообще не рабочие, если что.
Другие варианты в топике хоть иногда возвращают правильный результат, но тоже кривые.
25 сен 14, 15:02    [16621484]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
11.2.0.3.0 - 64bit все работает отлично
25 сен 14, 15:12    [16621554]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
MonteCarlos,

Я так понимаю что для автора буквы становятся в упорядочении "меньше" чем цирфы. И это относится не только к первой позиции.

Сходу можно придумать три подхода с разными ограничениями и разной степени развращенности.
1. Если строки длиной до 2000, то можно ввести фиктивный дополнительный "разряд". '+' > '-'.
2. Если учесть, что коды букв обычно больше 64 (я правда не думаю, что так для всех кодировок ), а цифр меньше, то можно битово ксорить 64 с кодами всех символов. Правда в этом случае затронутся и "перемешаются" и другие символы.
3. Самое банальное изменить порядок транслейтом.
select column_value
      ,regexp_replace(regexp_replace(column_value, '(\d)', '-\1'), '([a-zA-Z])', '+\1') x
      ,utl_raw.bit_xor(rawtohex(column_value), rawtohex(lpad('@', length(column_value), '@'))) y -- ascii('@') = 64 = 1000000
      ,translate(column_value
                ,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
                ,'qrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop')
          z
  from table(sys.odcivarchar2list('8'
                                 ,'0001'
                                 ,'123'
                                 ,'0002'
                                 ,'A1'
                                 ,'A11'
                                 ,'AA'))
order by 4
25 сен 14, 15:27    [16621626]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Ну и в запущенных случаях - Creating a New Linguistic Sort with the Oracle Locale Builder.
25 сен 14, 15:28    [16621636]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
MonteCarlos
11.2.0.3.0 - 64bit все работает отлично
Я сегодня добрый. Можешь проверять.
  from table(sys.odcivarchar2list('8'
                                 ,'0001'
                                 ,'123'
                                 ,'9002'
                                 ,'A1'
                                 ,'B1'
                                 ,'AA'))
25 сен 14, 15:36    [16621670]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
dbms_photoshop,
проверил твою телегу - полный рендомайз
в первом случае
0001
0002

123
8

A1
A11
AA

blue - по задумке автора числа с ведущими нулями должны быть м\у числовой и буквенной частью
red - порядок сортировки

тут вообще хз что выдает
  from table(sys.odcivarchar2list('8'
                                 ,'0001'
                                 ,'123'
                                 ,'9002'
                                 ,'A1'
                                 ,'B1'
                                 ,'AA'))
25 сен 14, 15:52    [16621749]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
MonteCarlos,

Сударь, стоит уточнить как вы проверяли.
Мною предполагалось закончить запрос словами "order by 2", "order by 3", "order by 4" соответственно в зависимости варианта.
Также мною предполагалось, что автор продолжает сортировать строки как строки вне зависимоти от наличия/отсутствия в них цифр и букв, с тем лишь различием от обычной сортировки, что сначала по порядку идут буквы, а не цифры как в нормальных условиях.
25 сен 14, 15:59    [16621790]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
что должно быть в order by, чтобы получить вот это?
8
123
0001
0002
A1
25 сен 14, 16:05    [16621825]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
dbms_photoshop
Мною предполагалось закончить запрос словами "order by 2 desc", "order by 3 desc", "order by 4 desc" соответственно в зависимости варианта.
И предполагаемый мною результат:
COLUMN_VALUE   
---------------
9002           
8              
123            
0001           
B1             
A1             
AA
25 сен 14, 16:05    [16621829]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
а почему 9002 > 8 ?
25 сен 14, 16:07    [16621838]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
MonteCarlos
что должно быть в order by, чтобы получить вот это?
8
123
0001
0002
A1
Подозрение у меня о перемешанности 0001 и 0002.
25 сен 14, 16:07    [16621841]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
MonteCarlos
а почему 9002 > 8 ?
dbms_photoshop
мною предполагалось, что автор продолжает сортировать строки как строки вне зависимоти от наличия/отсутствия в них цифр и букв
Я допускаю что не так понял всю глубину хотелки автора, так что слово начальнику транспортного цеха подождем ТС.
25 сен 14, 16:09    [16621849]     Ответить | Цитировать Сообщить модератору
 Re: необычный order by  [new]
Да ну
Member

Откуда: Первопрестольная
Сообщений: 242
MonteCarlos
что должно быть в order by, чтобы получить вот это?
8
123
0001
0002
A1
тынц
25 сен 14, 16:15    [16621878]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить