Oracle通过varchar2订购,其中包含数值

时间:2015-12-01 16:36:53

标签: oracle sql-order-by

我遇到一个问题,其中Oracle DB列(比如'REF_NO')是VARCHAR2并且带有类似于下面的值 如果我按照REF_NO进行订购,我会得到这个:

LET-2-1
LET-2-10
LET-2-11
LET-2-2
LET-2-3

这是有道理的,因为值被视为字符。我被要求更改此设置,以便返回的结果按如下顺序排序:

LET-2-1
LET-2-2
LET-2-3
LET-2-10
LET-2-11

我无法保证这些值的格式,所以我无法真正看到我如何使用正则表达式或子字符串,因为它是一个完全免费的文本条目供用户输入值。上面的例子恰好是所请求数据的样子。其他数据可能完全不同。

我看不出这是怎么可能的,所以希望得到一些建议。

其他信息

为了增加复杂性,以下是来自其他客户的更多示例:

Customer 1: OB 12, WE-11, WAN-001
Customer 2: P4, D1, W9
Customer 3: NTT-33A, RLC-33L, ARR-129B

2 个答案:

答案 0 :(得分:0)

select * from TABLE 
ORDER BY LENGTH(REF_NO), REF_NO

首先您需要按长度订购,然后按REF_NO

订购

答案 1 :(得分:0)

以下是步骤

create table test01 (c varchar2(30));
insert into test01 values ('LET-2-1');
insert into test01 values ('LET-2-10');
insert into test01 values ('LET-2-2');

查询

select * from test01 
order by to_number(SUBSTR(C,INSTR(C,'-',1)+1,INSTR(C,'-',1,2)-INSTR(C,'-',1)-1)),
to_number(SUBSTR(C,INSTR(C,'-',-1)+1));

假设所有值都具有 - 的结构 - 在上面的查询中,我尝试提取数字并按顺序转换为数字。