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')
我不知道如何在此查询中设置 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')