我在SQL甲骨文的一个问题,我试图创建一个包含字母和数字值的观点,我想他们在一个特定的顺序进行排序。
这里是我的查询:
create or replace view table1_val (val, msg_text) as
select
val, msg_text
from
table_val
where
val in ('L1','L2','L3','L4','L5','L6','L7','L8','L9','L10','L11','L12','L13','L14','G1','G2','G3','G4')
order by lpad(val, 3);
这些值显示如下:
G1,G2,G3,G4,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13
事情是,我想在WHERE条件,然后再显示L
值像G
值。在“VAL”列VARCHAR2(3 CHAR)
。该msg_text
列无关。有人能帮助我吗?我使用Oracle 12C。
你必须解释val
列的第二部分作为数
order by
case when val like 'L%' then 0 else 1 end,
to_number(substr(val,2))
这对于当前数据做工精细,但如果可以添加与非数字结构的新纪录在未来的失败。
更保守的(多难写),但安全将用于解码所有当前键,在最后的位置排序未知键(在本例中id = 18
):
order by
decode(
'L1',1,
'L2',2,
'L3',3,
'L4',4,
'L5',5,
'L6',6,
'L7',7,
'L8',8,
'L9',9,
'L10',10,
'L11',11,
'L12',12,
'L13',13,
'G1',14,
'G2',15,
'G3',16,
'G4',17,18)
基于的WHERE
条件的顺序,你不能做任何事情
但你可以在CASE
使用ORDER BY
ORDER BY CASE
WHEN SUBSTR(val, 1, 1) = 'L' THEN 1
WHEN SUBSTR(val, 1, 1) = 'G' THEN 2
ELSE 3
END,
TO_NUMBER (SUBSTR(val, 2, 10));
另一种选择要考虑可能使用正则表达式,如
SQL> with table1_val (val) as
2 (select 'L1' from dual union all
3 select 'L26' from dual union all
4 select 'L3' from dual union all
5 select 'L21' from dual union all
6 select 'L11' from dual union all
7 select 'L4' from dual union all
8 select 'G88' from dual union all
9 select 'G10' from dual union all
10 select 'G2' from dual
11 )
12 select val
13 from table1_val
14 order by regexp_substr(val, '^[[:alpha:]]+') desc,
15 to_number(regexp_substr(val, '\d+$'));
VAL
---
L1
L3
L4
L11
L21
L26
G2
G10
G88
9 rows selected.
SQL>