排序包含在一个特定的顺序字母和数字也值列表

问题描述 投票:1回答:3

我在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。

sql oracle
3个回答
1
投票

你必须解释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)

0
投票

基于的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));

0
投票

另一种选择要考虑可能使用正则表达式,如

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>
© www.soinside.com 2019 - 2024. All rights reserved.