对值列表进行排序,该列表包含字母和数字(按特定顺序)

时间:2019-02-04 15:20:55

标签: sql oracle

我在SQL Oracle中有问题,我正在尝试创建一个包含字母和数字值的视图,并希望按特定顺序对其进行排序。

这是我的查询:

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

问题是,我想先显示L值,然后再显示G值,如where条件。 “ val”列为VARCHAR2(3 CHAR)msg_text列无关紧要。有人可以帮我吗?我使用的是Oracle 12C。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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));

答案 2 :(得分: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>