Oracle自定义排序

Car*_*ter 3 sql oracle

查询......

select distinct name from myTable 
Run Code Online (Sandbox Code Playgroud)

返回一组以下列字符序列开头的值...

ADL*
FG*
FH*
LAS*
TWUP*
Run Code Online (Sandbox Code Playgroud)

其中'*'是字符串的剩余部分.

我希望通过以下方式进行排序......

ADL*
LAS*
TWUP*
FG*
FH*
Run Code Online (Sandbox Code Playgroud)

但是,我还希望通过时尚按照标准顺序在每个名称中进行排序.所以,举个例子,如果我有以下值

LAS-21A
TWUP-1
FG999
FH3
ADL99999
ADL88888
ADL77777
LAS2
Run Code Online (Sandbox Code Playgroud)

我希望它像这样排序......

ADL77777
ADL88888
ADL99999
LAS2
TWUP-1
FG999
FH3
Run Code Online (Sandbox Code Playgroud)

我最初认为我可以完成这个过滤通过解码(blah)执行一个命令,在解码中有一些类似的技巧,但我一直无法完成它.任何见解?

MJB*_*MJB 9

高飞和冗长,但应该工作:

select name, case when substr (name, 1, 3) = 'ADL'  then 1  
                  when substr (name, 1, 3) = 'LAS'  then 2
                  when substr (name, 1, 4) = 'TWUP' then 3
                  when substr (name, 1, 2) = 'FG'   then 4
                  when substr (name, 1, 2) = 'FH'   then 5
                  else 6
             end SortOrder
from myTable
order by 2, 1;
Run Code Online (Sandbox Code Playgroud)

不确定6是否是对其他项目进行排序的正确位置,但很明显如何解决这个问题.至少很明显发生了什么,即使我不知道你为什么这样做.

编辑:如果这些是唯一的值,您可以更改第4行和第5行:

select name, case when substr (name, 1, 3) = 'ADL'  then 1  
                  when substr (name, 1, 3) = 'LAS'  then 2
                  when substr (name, 1, 4) = 'TWUP' then 3
                  when substr (name, 1, 1) = 'F'    then 4
                  else 6
             end SortOrder
from myTable
order by 2, 1;
Run Code Online (Sandbox Code Playgroud)

另一个编辑:再次,如果这些是唯一的值,你可以进一步简化.由于唯一的一个故障是F*系列,你可以强制它们到最后,并使用实际的第一个字母为所有其他.这更简单,但过分依赖于我偏好的确切值.另一方面,它确实删除了许多看似不必要的调用substr:

select name, case when substr (name, 1, 1) = 'F'  then 'Z'
                  else name
             end SortOrder
from myTable
order by 2, 1;
Run Code Online (Sandbox Code Playgroud)