2015-04-20 3 views
0

У меня есть клиент, которому нужен отчет о токенах Лоусона, отсортированных в строгом буквенно-цифровом порядке. Ниже приведен пример тестового файла и запрос, который я использовал без успеха. Я не уверен, почему regex_replace здесь не работает. Буду признателен за любую помощь, которую я могу получить.сортировка альфаномерных строк в Oracle 11g

Спасибо.

enter code here 

create table sortest (token varchar2(6)); 

insert into sortest values ("BR00.1'); 
insert into sortest values ("BRFL.1'); 
insert into sortest values ("BRBF.1'); 
insert into sortest values ("BR00.2'); 
insert into sortest values ("BRRF.1'); 
insert into sortest values ("BRIP.1'); 
insert into sortest values ("BRRF.3'); 
insert into sortest values ("BR00.3'); 
insert into sortest values ("BRBF.2'); 
insert into sortest values ("BRRF.2'); 
insert into sortest values ("BR01.2'); 
insert into sortest values ("BR06.1'); 
insert into sortest values ("BR01.1'); 
insert into sortest values ("BR17.1'); 
insert into sortest values ("BR132'); 
insert into sortest values ("BR120'); 
insert into sortest values ("BR12.1'); 
insert into sortest values ("BR121'); 
insert into sortest values ("BR13.2'); 

commit; 

select * from sortest 
--order by token 
order by to_number(nvl(trim(regexp_replace(token,'[A-Za-z]')),0)) asc 
; 

Это возвращает '..... BR06.1, BR12.1, BR120, BR121, BR13.2, BR132, BR17.1 ....' и т.д. Заказ должен поставить BR13.2 и BR17.1 до BR120 и BR121, например.

+0

«заказать по токен "дает список, который вы сказали, неверен; «order by to_number ...», кажется, дает вам то, что вы хотите, по крайней мере для BR13.2, BR17.1 и т. д. Можете ли вы более четко показать, какой результат вы действительно хотите, и логику этого? –

ответ

1

Что вы показали в вопросе заказов только с помощью цифровой части стоимости, так что вы увидите что-то вроде:

TOKEN 
------ 
BRIP.1 
BRFL.1 
BRBF.1 
BR00.1 
BRRF.1 
BR00.2 
BRRF.2 
BRBF.2 
BR00.3 
BRRF.3 
BR01.1 
BR01.2 
BR06.1 
BR12.1 
BR13.2 
BR17.1 
BR120 
BR121 
BR132 

Если вы хотите приказать алфавитных символов и то по числа в них, вы можете использовать два выражения в порядке п - так вы заказываете первой алфавитной секции, а затем по количеству образованного из того, что осталось после того, как все буквы алфавита отрезаются:

select * from sortest 
order by regexp_substr(token, '[[:alpha:]]*'), 
    to_number(regexp_replace(token, '[[:alpha:]]', null)); 

TOKEN 
------ 
BR00.1 
BR00.2 
BR00.3 
BR01.1 
BR01.2 
BR06.1 
BR12.1 
BR13.2 
BR17.1 
BR120 
BR121 
BR132 
BRBF.1 
BRBF.2 
BRFL.1 
BRIP.1 
BRRF.1 
BRRF.2 
BRRF.3 
+0

Спасибо, Алекс. Он работает хорошо. Однако, когда я расширяю его, чтобы включить более длинные списки, похоже, что это работает не так хорошо. – user3161008

+0

Длина списка не должна иметь значения, но, возможно, у вас есть разные форматы, которые вам нужно обрабатывать. Вам нужно будет обновить вопрос, чтобы показать еще несколько значений выборки и порядок, в котором вы хотите, если это так. –

+0

Приносим извинения, я попал в дверь, прежде чем закончил свою мысль. Если я включу некоторые маркеры, такие как PISHC, PIREV, PIGTS, которые по какой-то причине имеют числовое значение в них, они не сортируются в порядке ASC. Кроме того, похоже, что порядок сортировки - это числовое расширение некоторых дополнительных записей, которые я сделал. Вот дополнительные записи: PIREV, PIGTS, PISHC, ACDL.1, ACSB.1 ACDM.1, ACBA.1, ACBB.1, ACDR.1, ACVW.1, ACAC.1, ATVW.1, ACBR.1 , ACBY.1, ACSS.2, ACTD.2, AC00.3, ACFL.3, ACTD.3, ACBB.3, AC00.4, ACBB.4, ACFL.4, ACDM.4. Большое спасибо за вашу помощь. Maalim – user3161008