ORACLE Order By number first in string 字段

ORACLE Order By number first in string field

我不知道如何在此查询中设置 order by。 我想先按数字排序,然后按字符排序。也许将每个字符更改为 HEX 会起作用?我不知道。我会在

订购时把结果放上去
COLA   COLB
----   ----
00     1
000A   2
000B   2
000C   2
000D   2
000F   2
000G   2
000H   2
000I   2
0000   2
0001   2
0002   2
0003   2
00030A 3
00030B 3
000300 3

我想要得到的结果是:

COLA   COLB
----   ----
00     1
0000   2
0001   2
0002   2
0003   2
000A   2
000B   2
000C   2
000D   2
000F   2
000G   2
000H   2
000I   2
000300 3
00030A 3
00030B 3

这就是我的查询:

with table1
as (
  select '00' COLA, 1 COLB from dual union
  select '000A' COLA, 2 COLB from dual union
  select '000B' COLA, 2 COLB from dual union
  select '000C' COLA, 2 COLB from dual union
  select '000D' COLA, 2 COLB from dual union
  select '000E' COLA, 2 COLB from dual union
  select '000F' COLA, 2 COLB from dual union
  select '000G' COLA, 2 COLB from dual union
  select '000H' COLA, 2 COLB from dual union
  select '000I' COLA, 2 COLB from dual union
  select '0000' COLA, 2 COLB from dual union
  select '0001' COLA, 2 COLB from dual union
  select '0002' COLA, 2 COLB from dual union
  select '0003' COLA, 2 COLB from dual union
  select '00030A' COLA, 3 COLB from dual union
  select '00030B' COLA, 3 COLB from dual union
  select '000300' COLA, 3 COLB from dual 
)
select * from table1 order by COLB, COLA

我已经尝试使用 LPAD,但它不起作用。

请试试这个

with table1
as (
 select '00' COLA, 1 COLB from dual union
select '000A' COLA, 2 COLB from dual union
select '000B' COLA, 2 COLB from dual union
select '000C' COLA, 2 COLB from dual union
select '000D' COLA, 2 COLB from dual union
select '000E' COLA, 2 COLB from dual union
select '000F' COLA, 2 COLB from dual union
select '000G' COLA, 2 COLB from dual union
select '000H' COLA, 2 COLB from dual union
select '000I' COLA, 2 COLB from dual union
select '0000' COLA, 2 COLB from dual union
select '0001' COLA, 2 COLB from dual union
select '0002' COLA, 2 COLB from dual union
select '0003' COLA, 2 COLB from dual union
select '00030A' COLA, 3 COLB from dual union
select '00030B' COLA, 3 COLB from dual union
select '000300' COLA, 3 COLB from dual 
)
select * from table1 order by COLB, to_number(regexp_substr(COLA, '^[[:digit:]]*')), COLA

一种方法是提取号码:

order by colb,
         cast(regexp_substr(cola, '[0-9]', 1, 1) as number),
         cola

当我在我的数据库中 运行 你的例子时,我得到了 'correct' 根据你的列表排序的顺序。检查你的 NLS_SORT 设置;我的设置为二进制。

通过为会话更改它来试用它;

ALTER SESSION SET nls_sort='BINARY';

此参数有多种可能性,因此如果您想进行试验,可以在 V$NLS_VALID_VALUES 视图中找到各种可能性。

我刚刚还发现您可以执行以下操作;

SELECT * FROM table1 ORDER BY colb, NLSSORT(cola, 'NLS_SORT=BINARY')

您可以使用 TRANSLATE 函数:

  with table1 as (
  select '00' COLA, 1 COLB from dual union
  select '000A' COLA, 2 COLB from dual union
  select '000B' COLA, 2 COLB from dual union
  select '000C' COLA, 2 COLB from dual union
  select '000D' COLA, 2 COLB from dual union
  select '000E' COLA, 2 COLB from dual union
  select '000F' COLA, 2 COLB from dual union
  select '000G' COLA, 2 COLB from dual union
  select '000H' COLA, 2 COLB from dual union
  select '000I' COLA, 2 COLB from dual union
  select '0000' COLA, 2 COLB from dual union
  select '0001' COLA, 2 COLB from dual union
  select '0002' COLA, 2 COLB from dual union
  select '0003' COLA, 2 COLB from dual union
  select '00030A' COLA, 3 COLB from dual union
  select '00030B' COLA, 3 COLB from dual union
  select '000300' COLA, 3 COLB from dual 
)
select * from table1 order by COLB, TRANSLATE(COLA,'0123456789','0123456789'),TRANSLATE(COLA,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','ABCDEFGHIJKLMNOPQRSTUVWXYZ')