如何在oracle中对字母数字字符串进行排序?

时间:2017-02-13 13:23:56

标签: sql oracle oracle11g

输入是:

Section1
Section2
Section3
Section10
Section11
Section1A
Section1B
Section12
Section11A
Section11B

我希望输出如下:

Section1
Section1A
Section1B
Section2
Section3
Section10
Section11
Section11A
Section11B
Section12

我试过了查询:

select section_name
from sections
order by length(section_name),section_name

1 个答案:

答案 0 :(得分:2)

假设您的字符串结构是固定的,如您的示例所示,这可能是一种方式:

SQL> select x,
  2         to_number(regexp_substr(x, '[0-9]+')) numericPart,
  3         regexp_substr(x, '([0-9]+)([A-Z])', 1, 1, '', 2) optionalChar
  4  from (
  5          select 'Section1' x from dual union all
  6          select 'Section2' from dual union all
  7          select 'Section3' from dual union all
  8          select 'Section10' from dual union all
  9          select 'Section11' from dual union all
 10          select 'Section1A' from dual union all
 11          select 'Section1B' from dual union all
 12          select 'Section12' from dual union all
 13          select 'Section11A' from dual union all
 14          select 'Section11B' from dual
 15  )
 16  order by numericPart,
 17           optionalChar nulls first
 18  ;

X          NUMERICPART OPTIONALCHAR
---------- ----------- ----------------------------------------
Section1             1
Section1A            1 A
Section1B            1 B
Section2             2
Section3             3
Section10           10
Section11           11
Section11A          11 A
Section11B          11 B
Section12           12

在这里,您首先按数字部分排序,将其视为数字,然后在数字后面考虑(可选)字符。