2010-03-07 86 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 
相关问题