我遇到一个问题,其中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
答案 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));
假设所有值都具有 - 的结构 - 在上面的查询中,我尝试提取数字并按顺序转换为数字。