CASE
是表達式產生一個單一的值。它不能像您在其他語言中那樣用於流量控制,或者您可以嘗試使用IF
。查詢中也不能使用IF
。
以下分別對待每個條件。如果條件不匹配,則該表達式的結果爲NULL,在任何排序中都將忽略該結果。因此,這些條款的順序是無關緊要的,因爲只有在所有條件都滿足將所觀察到的:
ORDER BY
CASE WHEN @SortColumn = 'Type' AND @SortDir = 'DESC' THEN Type END DESC,
CASE WHEN @SortColumn = 'Name' AND @SortDir = 'DESC' THEN Name END DESC,
CASE WHEN @SortColumn = 'Type' AND @SortDir = 'ASC' THEN Type END,
CASE WHEN @SortColumn = 'Name' AND @SortDir = 'ASC' THEN Name END;
這些或許可以有所結合,但我不知道數據類型,所以這可能是最安全的。如果數據類型相同,則:
ORDER BY
CASE WHEN @SortDir = 'DESC' THEN
CASE WHEN @SortColumn = 'Type' THEN Type ELSE Name END
END DESC,
CASE WHEN @SortDir = 'ASC' THEN
CASE WHEN @SortColumn = 'Type' THEN Type ELSE Name END
END;
你不能垮更遠,因爲你不能在一個表達式執行有條件ASC
與DESC
。但您可以通過其他方式進行簡化,例如以下查詢將產生與上面相同的結果,即使在某些情況下,按順序將嘗試執行(比如說)ORDER BY Type DESC, Type DESC
- 我不是100%確定優化程序是否簡化爲冗餘但它應該摺疊爲單一類型運算符(當需要時 - 有時這個查詢可以根據用於滿足查詢的索引產生固有的排序)。
ORDER BY
CASE WHEN @SortColumn = 'Type' AND @SortDir = 'DESC' THEN Type END DESC,
CASE WHEN @SortColumn = 'Name' AND @SortDir = 'DESC' THEN Name END DESC,
CASE WHEN @SortColumn = 'Type' THEN Type END,
CASE WHEN @SortColumn = 'Name' THEN Name END;
......或者......
ORDER BY
CASE WHEN @SortDir = 'DESC' THEN
CASE WHEN @SortColumn = 'Type' THEN Type ELSE Name END
END DESC,
CASE WHEN @SortColumn = 'Type' THEN Type ELSE Name END;
你也可以考慮,因爲動態SQL,如果這變得更加複雜,有大量的維護工作在這裏。
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT ... ORDER BY ' + @SortColumn + ' ' + @SortDir;
PRINT @sql;
-- EXEC sp_executesql @sql;
當然,這可能引入其他問題(查詢,計劃緩存膨脹其餘的可維護性...)
哦,聰明,將不得不在博客文章中使用此選項。 +1,但它不會解析 - 不應該是第四行是'rnk = ROW_NUMBER()OVER('而不是'rnk = ROW_NUMBER('? –
)謝謝,並且感謝我回到我的答案:錯別字......看起來很高的時候我把它稱爲一天 –
爲什麼當鍵入然後鍵入,還有當名稱然後鍵入? – InfoLearner