2017-03-09 69 views
1

我有一個自定義的ORDER BY子句,看起來很像這個定製ORDER BY功能SQL

SQL Custom Order By Clause

SELECT * FROM example 
ORDER BY 
CASE 
    WHEN name = 'I want this first' THEN 0 
    WHEN name = 'I want this second' THEN 1 
    WHEN name = 'We get the picture' THEN 2 
    ELSE 99 END ASC 

然而,這種情況下,聲明已經發展的要求,我希望能夠重用爲其他查詢排序。

我看到我的選擇是

  1. 複製粘貼!
  2. 添加另一列表中專門爲這個排序順序

在我的頭,好像我應該能夠通過執行排序邏輯功能。但經過一些關於SO和谷歌的搜索後,我找不到任何東西,並認爲這可能也會幫助其他人。

+0

使用INLINE用戶定義的函數 – McNets

回答

2

一種選擇是一個CTE:

with ordering as (
     select v.* 
     from (values(1, 'val1'), (2, 'val2'), (3, 'val3')) v(priority, val) 
    ) 
select e.* 
from example e 
order by (select priority from ordering o where o.val = e.name); 

我會鼓勵你做一個明確的join,因爲這可能會影響到查詢的語義。 A join在之前過濾記錄,select,where,group byhaving子句被處理(邏輯上)。 order by僅在結果集中使用結果(邏輯上)。

您當然可以將CTE值存儲在臨時表或表變量中。這可能是你以後的事情。

另一種方法是一些黑客,但在某些情況下工作。您可以用下列方法替換邏輯:

order by charindex('[' + name + ']', '[name1][name2][name]') 

這裏假定所有名稱都在列表中。而且這些名稱沒有分隔符。這不會直接解決您的問題,但可以將該字符串作爲變量存儲在代碼塊中,或者甚至作爲表格中的計算列存儲。

4

創建第二個表有兩列(名稱,等級)

SELECT * 
FROM example e INNER JOIN table2 t2 on e.name = t2.name 
ORDER BY t2.rank ASC; 

而且你的第二個表將包含配對。

+1

我不鼓勵這種方法,因爲'JOIN'會影響查詢的語義。 –

+0

呵呵,我總是認爲db會足夠聰明來優化。感謝評論,否則我永遠不會讀你的答案,並瞭解到這一點。 –

+0

以下查詢可能不會產生相同的結果:'select e。*,count(*)over()from example'。 –