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