2011-10-22 51 views
7

這裏是我試圖解決的情況:自定義按SQL順序排序的子句?

我有一個查詢可以返回一組記錄。被排序的字段可能有許多不同的值 - 爲了這個問題,我們會說這個值可能是A,B,C,D,E或Z

現在取決於查詢的結果,排序需要表現如下: 如果只找到AE記錄,那麼「自然」排序它們就沒問題。但是如果Z記錄在結果中,那麼它需要是查詢中的第一個結果,但其餘記錄應該是「自然」排序順序。

例如,如果ACD被發現,那麼結果應該是

A 
C 
D 

但如果ABDEZ被發現,那麼結果應該進行排序:

Z 
A 
B 
D 
E 

目前,查詢是這樣的:

SELECT NAME, SOME_OTHER_FIELDS FROM TABLE ORDER BY NAME 

我知道我可以編寫一個排序函數來做我想做的事情,但是由於我如何使用結果,我似乎無法使用,因爲結果正在處理由第三方庫,我只是通過SQL查詢。然後它正在處理結果,而且我似乎沒有任何掛鉤來排序結果並將結果傳遞給庫。它需要自己完成SQL查詢,並且我無法訪問庫的源代碼。

因此,對於你們所有的SQL專家,你能爲我提供一個查詢來完成我想要的嗎?

+2

你正在使用哪個數據庫? – evilone

+0

DB2是後端。我正在使用一些遺留代碼。如果我可以避免更改系統正在使用的SQL,我可以。但偶爾我會發現需要修復的東西。 –

回答

33

你如何識別Z記錄?它與衆不同?一旦你明白了,把它添加到你的ORDER BY子句中。

SELECT name, * 
FROM [table] 
WHERE (x) 
ORDER BY 
    (
    CASE 
     WHEN (record matches Z) THEN 0 
     ELSE 1 
    END 
    ), 
    name 

這樣,只有Z記錄匹配第一個排序,所有其他記錄將按二階排序(名稱)排序。如果你真的不需要它,你可以排除二階排序。

例如,如果Z是字符串「鮑勃」,那麼你的查詢可能是:

SELECT name, * 
FROM [table] 
WHERE (x) 
ORDER BY 
    (
    CASE 
     WHEN name='Bob' THEN 0 
     ELSE 1 
    END 
    ), name 

我的例子是T-SQL,因爲你還沒有提到你正在使用的數據庫。

+0

這看起來可能是我想要走的方向。 –

1

不知道什麼DB使用 - 以下作品甲骨文:

SELECT 
NAME, 
SOME_OTHER_FIELDS, 
DECODE (NAME, 'Z', '_', NAME) SORTFIELD 
FROM TABLE 
ORDER BY DECODE (NAME, 'Z', '_', NAME) ASC 
1

有許多的方法來解決這個問題,最好的解決方案取決於一些你不商量因素如這些A..Z值的性質以及您正在使用的數據庫產品。

如果你只有有進行排序上方設置了一個值,可以ORDER BY是該值到最低排序值映射(與CASEIIFIFEQ,這取決於你的數據庫)的表達式。

如果你有幾個不同的特殊類型的值你可以ORDER BY一個更復雜的表達式,或者你可以UNION在一起的幾個SELECT S,一個SELECT默認排序和一個額外的SELECT每個特殊值。 SELECT會包含一個排序欄。

最後,如果您有相當多的值,則可以將排序值放入單獨的表中,並將JOIN表放入查詢中。