Как получить порядок сортировки натуральных чисел c в Oracle? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть столбец с буквой, за которой следуют либо цифры, либо буквы:

ID_Col
------
S001
S1001
S090
SV911
SV800
Sfoofo
Szap
Sbart

Как я могу естественным образом заказать его с номерами (AS C), затем буквы по алфавиту? Если он начинается с S, а остальные символы являются числами, выполните сортировку по номерам. Остальное, сортировка по письму. Таким образом, SV911 должно быть отсортировано в конце по буквам, поскольку оно также содержит V. Например,

ID_Col
------
S001
S090
S1001
Sbart
Sfoofo
SV800
SV911
Szap

Я вижу, что это решение использует регулярное выражение в сочетании с функцией TO_NUMBER, но, поскольку у меня также есть записи без чисел, это, похоже, не работает для меня. Я попробовал выражение:

ORDER BY 
    TO_NUMBER(REGEXP_SUBSTR(ID_Col, '^S\d+$')), 
    ID_Col 

    /* gives ORA-01722: invalid number */

1 Ответ

3 голосов
/ 04 марта 2020

Поможет ли это?

SQL> with test (col) as
  2  (select 'S001'   from dual union all
  3   select 'S1001'  from dual union all
  4   select 'S090'   from dual union all
  5   select 'SV911'  from dual union all
  6   select 'SV800'  from dual union all
  7   select 'Sfoofo' from dual union all
  8   select 'Szap'   from dual union all
  9   select 'Sbart'  from dual
 10  )
 11  select col
 12  from test
 13  order by substr(col, 1, 1),
 14    case when regexp_like(col, '^[[:alpha:]]\d') then to_number(regexp_substr(col, '\d+$')) end,
 15    substr(col, 2);

COL
------
S001
S090
S1001
Sbart
Sfoofo
SV800
SV911
Szap

8 rows selected.

SQL>
...