2011-09-18 104 views
4

我需要編寫一個查詢,做到這一點:條件ORDER BY取決於列的值

SELECT TOP 1 
FROM a list of tables (Joins, etc) 
ORDER BY Column X, Column Y, Column Z 

如果ColumnXNOT NULL,然後在那一刻,我重新選擇,採用了略有不同的ORDER BY

所以,我做了同樣的查詢,兩次。如果第一個在某個列中有一個NULL,我將從該過程返回該行。但是,如果值不是NULL - 我必須執行另一個相同的選擇,除了按不同的一列或兩列排序。

我現在所做的是第一次將它選入臨時表。然後檢查列的值。如果沒問題,請返回臨時表,否則,重做select並返回結果集。

更多細節:

在英語中,這個問題我問了數據庫:

返回我的某些出庭的結果(通過索引外鍵)。我預計大約有1000行。按出現日期排序(列,未編制索引,可爲空),最後一次出現。檢查'importId'。如果導入ID對於前1行不是NULL,那麼我們需要運行相同的查詢 - 但是這次,按導入ID(最後一個)排序,然後返回該行。否則,只需返回原始查詢的前1行。

+0

問題是什麼? –

+0

什麼版本的SQL Server,你能說更具體的條款?例如您試圖訂購的不同列的數據類型是什麼? –

+0

你的方法似乎是合理的。需要了解更多關於表,索引和查詢的詳細信息,以查看是否有任何方法可以避免有效地執行2個查詢。 –

回答

2

我說要做到這一點,最好的辦法是在單個查詢CASE聲明...

SELECT TOP 1 FROM ... ORDER BY 
    (CASE WHEN column1 IS NULL THEN column2 ELSE column1 END) 
+0

你的語法混淆了......我認爲你的意思是'CASE當column1 IS NULL'... –

+0

你是對的 - 謝謝 –

+0

這個(和合並)可能使查詢計劃比2個單獨的'TOP 1 '這兩個查詢都使用索引。 –

0

您可以使用COALESCE函數將可空列變爲友好值的order。

SELECT CAST(COALESCE(MyColumn, 0) AS money) AS Column1 
FROM  MyTable 
ORDER BY Column1;