Алфавитно-цифровая сортировка Oracle - PullRequest
0 голосов
/ 25 июня 2018

У меня есть мои данные как-то так

select x FROM (
select 'OUTDR1004' x from dual union all
select 'CXL10570' x from dual union all
select 'OUTDR904' x from dual union all 
select '213OUTD' x from dual union all 
select '1111111111231' x from dual 
) order by case when regexp_like(x,'^[[:digit:]]') then LPAD(x,50, '0') else x end; 

Упорядочить по дает мне данные в следующем порядке

213OUTD
1111111111231
CXL10570
OUTDR1004
OUTDR904

Но я хочу, чтобы мои данные в следующем порядке

213OUTD
1111111111231
CXL10570
OUTDR904
OUTDR1004

Спасибо.

1 Ответ

0 голосов
/ 25 июня 2018

Похоже, что вы хотите сделать, это составная сортировка - вы хотите сортировать алфавитные символы по алфавиту, но вы хотите, чтобы числовые символы были сгруппированы вместе и рассматривались как числа.

select x
FROM (
select '144' x from dual union all
select '211' x from dual union all
select '211B' x from dual union all 
select '207AB' x from dual union all 
select '213OUTD' x from dual  union all 
select '1111111111231' x from dual union all
select 'OUTDR1004' x from dual union all
select 'CXL10570' x from dual union all
select 'OUTDR904' x from dual
) order by case
    -- starts with number, pad number part with zeros to sort numerically
    when regexp_like(x,'^[[:digit:]]') then lpad(regexp_substr(x, '^[[:digit:]]+'),50,'0')  
    -- if x starts with non-numeric, primary sort the alpha portion
    when regexp_like(x, '^[^[:digit:]]') then regexp_substr(x, '^[^[:digit:]]+') 
    else x end,
   -- if x starts with a non-numeric, secondary sort by the numeric portion (zero padded)
   case when regexp_like(x, '^[^[:digit:]]') then lpad(regexp_substr(x, '[[:digit:]]+$'),50,'0')
     -- if x starts with a numeric, secondary sort by the alpha portion
     when regexp_like(x, '^[[:digit:]]') then regexp_substr(x, '[^[:digit:]]+$')
     else x end nulls first; 

Надеюсь, у вас есть только те случаи, которые вы здесь показали, и нет таких случаев, как 302OUTDR378, иначе эта логика сортировки быстро станет неуправляемой.

Редактировать: обновлено, чтобы перестать включать альфа-часть в дополнение к нулю.

Редактировать 2: обновлено, чтобы добавить 'null first' во вторичную сортировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...