2010-03-07 40 views
1

這是一個簡化的任務,我必須在實際項目中解決。在這個項目中,數據存儲在HSQLDB中。數據通過JDBC訪問。如何結合使用一個SQL查詢獨立排序的一個表中的兩個結果集?

我有一個表:

name | flag 
----------- 
aa | 1 
bb | 0 
cc | 1 
dd | 0 
ee | 1 
ff | 0 

我需要編寫查詢到以下表中獲取:

name | flag 
----------- 
aa | 1 
cc | 1 
ee | 1 
ff | 0 
dd | 0 
bb | 0 

決賽桌,如同與國旗行= 1取,整理上升,標記= 0的行被採取並分類並且結果一個接一個地結合。

請注意,與標誌= 1,行與行標誌= 0有相反排序順序。

是否可以在SQL中執行?我不想做兩個查詢並手動合併Java代碼中的ResultSets。

回答

3

在任何SQL,只適用所以它必須在那裏進行的最外面的秩序。

我不知道這是否在您的SQL方言(並不能檢查對不起),但你可以在行做到這一點

SELECT name, flag 
FROM 'table' 
ORDER BY 
    flag desc, 
    CASE WHEN flag = 1 THEN name ELSE '' END, 
    CASE WHEN flag = 0 THEN name ELSE '' END DESC 
+0

謝謝,您的解決方案在HSQLDB中工作。 但是,你能解釋一下數據庫中的排序工作嗎?引擎選擇行,然後應用兩種順序表達式:「flag desc,name,'desc'(if flag = 1)or this:」flag desc,',name desc「(if flag = 0)?我從來沒有遇到動態的「秩序」表達式。 – ilya 2010-03-07 17:20:13

+0

它對3列進行排序,但第2列或第3列是常數,因此被有效忽略 – gbn 2010-03-07 18:05:53

2

試試這個:

SELECT name, flag 
FROM 'table' 
ORDER BY flag desc, name 

讓數據庫做的工作時,你可以。不要在Java中做這樣的事情。認爲「SQL優先」。

+0

請注意,該列名其中標誌= 0排序順序相反。 – ilya 2010-03-07 15:40:28

+0

請寫出一個連貫的問題,並停止粗魯。我現在正在投票你的問題。 – duffymo 2010-03-07 16:06:14

+0

@Ilya:你在這個答案後添加了這個要求 – gbn 2010-03-07 16:31:44

1

order by可以採取多列:

select * 
from table 
order by flag desc, name asc 
相關問題