2016-12-01 55 views
1

我有我的SQL查詢之一以下語句:順序按動態,多領域

 CASE WHEN @Ordering = 'asc' THEN YEAR(TimeIn) ASC, DATEPART(WEEK, TimeIn) ASC END, 
     CASE WHEN @Ordering = 'desc' then YEAR(TimeIn) DESC, DATEPART(WEEK, TimeIn) DESC END 

,但我得到一個錯誤:

消息156,級別15,狀態1,過程第43行[Batch Start Line 4] 關鍵字'ASC'附近的語法不正確。

我試過搜索的例子,但它們都涉及到一個字段,而不是多個,因爲我試圖在那裏做。

任何人都可以建議我怎樣才能糾正上述請?

+2

問題是'ASC/DESC',他們將不得不被移出'CASE'表達式。所以這樣做的唯一方法就是我認爲的動態SQL。 – NickyvV

+0

啊,好吧,那很糟糕。真的想要避免動態SQL :( – Philip

回答

4

您可以重複同樣的CASE,方向來後的CASEEND

ORDER BY CASE WHEN @Ordering = 'asc' THEN YEAR(TimeIn)   END ASC, 
      CASE WHEN @Ordering = 'asc' THEN DATEPART(WEEK, TimeIn) END ASC, 
      CASE WHEN @Ordering = 'desc' THEN YEAR(TimeIn)   END DESC, 
      CASE WHEN @Ordering = 'desc' THEN DATEPART(WEEK, TimeIn) END DESC 
0

這個怎麼樣

order by 
(CASE @Ordering when 'asc' then 1 when 'desc' then -1 else 0 end)*TimeIn ASC, 
(CASE @Ordering when 'asc' then 1 when 'desc' then -1 else 0 end)*DATEPART(WEEK, TimeIn) ASC 
0

我們可以在短一點的方式執行同樣的事情,請試試看:

ORDER BY 
CASE WHEN @Ordering = 'asc' THEN 
    CONCAT(YEAR(TimeIn),DATEPART(WEEK, TimeIn)) 
END ASC, 
CASE WHEN @Ordering = 'desc' THEN 
    CONCAT(YEAR(TimeIn),DATEPART(WEEK, TimeIn)) 
END DESC 

注意:可以在SQL Server> = 2012中使用CONCAT,在較低版本中,我們可以將+用於連接。