2010-06-15 47 views
3

查询...甲骨文自定义排序

select distinct name from myTable 

返回以下列字符序列启动了一堆价值...

ADL* 
FG* 
FH* 
LAS* 
TWUP* 

其中“*”是字符串的其余部分。

我想要做的ORDER BY将按以下方式...

ADL* 
LAS* 
TWUP* 
FG* 
FH* 

但是,我也希望通过时尚的标准顺序每名内排序。所以,举例来说,如果我有以下值

LAS-21A 
TWUP-1 
FG999 
FH3 
ADL99999 
ADL88888 
ADL77777 
LAS2 

我希望它进行排序是这样的...

ADL77777 
ADL88888 
ADL99999 
LAS2 
TWUP-1 
FG999 
FH3 

我最初以为我可以做到这一点通过过孔做解码的顺序(嘘)有一些像解码里面的诡计,但我一直无法完成它。任何见解?

回答

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; 

不知道六是其他项目进行排序正确的位置,但很明显如何解决。至少很清楚发生了什么,即使我不知道你为什么这样做。

编辑:一次,如果这是唯一的值,可以更加简化:如果这是唯一值,你可以改变线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; 

ANOTHER编辑 。由于唯一一个失序是F *系列,您可以强制它们结束,并为所有其他字母使用实际的第一个字母。这很简单,但是依赖于我的偏好的确切值。在另一方面,它消除了许多看似不必要的调用来substr

select name, case when substr (name, 1, 1) = 'F' then 'Z' 
        else name 
      end SortOrder 
from myTable 
order by 2, 1; 
+0

是的,尽管你可以交替使用喜欢那里,而不是SUBSTR的()。不知道哪个会更快。 – 2010-06-15 20:19:53

+0

最终编辑的好处。谢谢你,先生! – Carter 2010-06-15 21:31:13

3

的问题是,你的前缀包含一个变量的字符数。这是部署正则表达式的好时机(如果您有10g或更高版本)。

SQL> select cola 
    2 from t34 
    3 order by decode(regexp_substr(cola, '[[:alpha:]]+') 
    4     , 'ADL' , 10 
    5     , 'LAS', 20 
    6     , 'TWUP', 30 
    7     , 'FG' , 40 
    8     , 'FH' , 50 
    9     , 60) 
10   , cola 
11/

COLA 
---------- 
ADL77777 
ADL88888 
ADL99999 
LAS-21A 
LAS2 
TWUP-1 
FG999 
FH3 

8 rows selected. 

SQL> 

如果早期版本的Oracle,我们可以使用OWA_PATTERN.AMATCH()函数相同的效果:

SQL> select cola 
    2 from t34 
    3 order by decode(owa_pattern.amatch(cola, 1, '^[A-Z]+') 
    4     , 'ADL' , 10 
    5     , 'LAS', 20 
    6     , 'TWUP', 30 
    7     , 'FG' , 40 
    8     , 'FH' , 50 
    9     , 60) 
10   , cola 
11/

COLA 
---------- 
ADL77777 
ADL88888 
ADL99999 
FG999 
FH3 
LAS-21A 
LAS2 
TWUP-1 

8 rows selected. 

SQL> 
+0

谢谢,这肯定会做到这一点。不幸的是我只有9岁。 – Carter 2010-06-15 21:29:51