2010-07-28 51 views
4

我需要幫忙寫一個選擇子句查詢。訂購選擇子句結果的具體方式

例如,可以說我有一個這樣的查詢:

select value from some_table order by value asc; 

,結果我得到這個:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

而是一種特殊的查詢我想寫,就是其中之一仍然會給我排序的的值,但會把後。

這意味着我需要一個值是經常命令。

它可以用其他方式描述。可以說我有兩組數字(例如): A = {a | 1 < = a < = 118,a!= 78} B = {b | B> 118} 我有一個基團C = AUBU {78} 和我所需要的所有這些值進行排序,如 「A,78,B」

+0

在你最後的例子中,如果值是什麼沒有任何三組?即負數和零。 – 2010-07-28 12:43:18

+1

SQL只有一個數據結構:表。在包含「sort_order」列的表中將您的組建模爲行和列。在你的查詢中對這個表加入'JOIN',並使用'ORDER BY'子句中的'sort_order'列。 – onedaywhen 2010-07-28 16:06:23

回答

9

假設值是整數,則可以這樣做:

SELECT * 
    FROM tbl 
ORDER BY 
     CASE 
     WHEN value = 5 THEN 8.5 
     ELSE value 
     END 
+1

注意:這可能會在9之後放5。 – 2010-07-28 12:51:52

+0

@Mark Byers - 好的,謝謝。我做了一個修復。 – dcp 2010-07-28 12:59:25

+2

我不喜歡這個,但它似乎很受歡迎,所以我會一起玩......爲什麼不使用'WHEN value = 5 THEN 8.5'呢? – 2010-07-28 13:04:06

2

您可以通過使用多個條件,您的訂單:

ORDER BY (value BETWEEN 1 AND 118) AND value != 78 DESC, 
     value > 118 DESC, 
     value 

這將確保匹配第一個斷言其價值是第一位的,然後這些值匹配第二斷言,最後價值觀匹配沒有謂詞。如果有一個聯繫(兩個號碼匹配相同的謂詞),那麼這些號碼按升序排序。

請注意,我沒有在Oracle中測試過。可能有必要將謂詞包裝在CASE表達式(CASE WHEN predicate THEN 1 ELSE 0 END)中以使排序在Oracle中運行。

ORDER BY 
    (CASE WHEN ((value BETWEEN 1 AND 118) AND value <> 78) THEN 1 ELSE 0 END) DESC, 
    (CASE WHEN (value > 118) THEN 1 ELSE 0 END) DESC, 
    value 
+0

+1尼斯,還有8個字符可以填充。 – 2010-07-28 12:49:25

+0

我認爲這不適用於Oracle。當我嘗試它時,我得到「ORA-00907:缺少右括號」,並且它在第一個「值」之後抱怨第一個空格。 – dcp 2010-07-28 12:51:32

+0

嗯...經過修復使其在Oracle中工作後,我更喜歡DRapp的解決方案。 – 2010-07-28 12:55:15

2

或者在DCP的回答,擴大...

SELECT * 
    FROM tbl 
ORDER BY 
     CASE 
     WHEN (Condition for first grouping) THEN 1 
     WHEN (Condition for second grouping) THEN 2 
     WHEN (Condition for third grouping) THEN 3 
     ELSE 4 
     END 
+0

+1我更喜歡這個自己的答案。 – 2010-07-28 12:58:08

+0

謝謝你,你的解決方案幫助我理解:) – David 2010-07-30 06:31:21