2014-09-19 33 views
0

我在一個過程中返回一個巨大的select,我不想定義它是如何定序的。 我wan't選擇三種領域之一,它是否會上升或下降,如果沒有的三個選項被定義,默認情況下它降序在ORDER BY(MySQL)中使用'case'

這樣

ORDER BY 
CASE option1 
    WHEN 0 THEN     
     CASE option2 
      WHEN 0 THEN firstField DESC 
      WHEN 1 THEN firstField ASC 
     END 
    WHEN 1 THEN    
     CASE option2 
      WHEN 0 THEN secondField DESC 
      WHEN 1 THEN secondField ASC 
     END 
    WHEN 2 THEN    
     CASE option2 
      WHEN 0 THEN thirdField DESC 
      WHEN 1 THEN thirdField ASC 
     END     
    ELSE 
     firstField DESC 
    END 
END; 

返回的第一個字段當然,這不起作用...... mysql在單詞'DESC'和'ASC'中引入錯誤,我怎麼能使這個工作?

+0

你可以使用動態查詢來生成你想要的?因爲你必須在每個CASE的END子句之後指定DESC或ASC! – Neels 2014-09-19 13:28:59

+0

我不知道,它是如何工作的? – 2014-09-19 13:31:07

+0

什麼是字段類型? – Mureinik 2014-09-19 13:32:27

回答

1

爲了做到這一點,您必須將DESC/ASC移到案例之外,因爲它們在表達式之後。

您還應該分隔字段。在CASE語句中,如果字段具有不同的數據類型,則它們將被轉換爲適合所有(通常爲VARCHAR)的字段,這可能會擾亂排序。

你可以這樣做:

ORDER BY CASE WHEN option1=0 AND option2=0 THEN firstField END DESC, 
     CASE WHEN option1=0 AND option2=1 THEN firstField END ASC, 
     CASE WHEN option1=1 AND option2=0 THEN secondField END DESC, 
     CASE WHEN option1=1 AND option2=1 THEN secondField END ASC, 
     CASE WHEN option1=2 AND option2=0 THEN thirdField END DESC, 
     CASE WHEN option1=2 AND option2=1 THEN thirdField END ASC, 
     firstField DESC 

每個案例將返回NULL所有行時不適用,因此具有同樣的價值。事實上,第一種情況是不必要的,因爲它會被默認捕獲,但爲了清晰起見,我已經將其包括在內。然而,這可能會導致非常昂貴的訂購流程!

我想我寧願動態構建SQL,我會使用允許的排序值數組來保證它的安全。