2010-06-15 50 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