订购UNION结果

时间:2018-03-29 22:53:06

标签: sql

我道歉,因为我知道这是一个重复的问题,但由于某些原因,我的大脑无法将这些其他问题的答案转换成我在这里遇到的独特问题。

我正在运行一个包含存储在SQL数据库中的信息的虚构网站。一个页面列出了一堆字符。我需要做的是能够通过派系列出这些角色。但有些人没有派系,而在SQL数据库中,他们的派系被列为0.当按派系排序时,显然我使用ORDER BY Factionnumber。我希望这些无派系的人出现在底部而不是顶部,但是按照派系编号排序,因为他们是0,他们首先出现。我希望能够为每个子语句使用ORDER子句,但这会导致SQL解析错误。所以我必须同时订购结果。

到目前为止,我的SQL查询是这样的(为了简洁起见,只减少了几个字段名称):

SELECT Id, Charactername, Faction FROM characters
WHERE Faction>0
 UNION
SELECT Id, Charactername, Faction
WHERE Faction=0 ORDER BY Faction, CharacterName

我的问题是,即使我有一个由UNION加入的两个语句,我也是最后由派系排序的,所以SQL只是取两个语句的结果并在之后将它们混合在一起。如何让无派系的角色出现在底部?我在这里采取了其他答案中的一些陈述 - 例如,在parantheses等中使用子查询 - 并试图根据我自己的独特情况调整它们,但我总是遇到逻辑或解析错误我似乎无法安顿下来。

有没有人有一个优雅的解决方案?谢谢!

如果您需要,我可以提供该网站的网址,但我一开始并不想,因为这似乎是在一个不适合此目的的网站上进行的公然自我推销。

3 个答案:

答案 0 :(得分:1)

您可以这样做:

SELECT Id, Charactername, Faction FROM characters
WHERE Faction>0
UNION
SELECT Id, Charactername, 999999999 as Faction FROM characters
WHERE Faction=0 ORDER BY Faction, CharacterName

第二个选择中的数字必须是biger然后是max(Faction)然后在你的代码中你将999999999视为空!

您可以使用案例!

SELECT Id, Charactername, Case When Faction=0 Then 9999999999 else Faction end AS Faction 
FROM characters
ORDER BY Faction, CharacterName

答案 1 :(得分:0)

如果您使用的是Sql Server,则可以从cte中受益:

;with cte (id,Charactername,Faction) as (
   SELECT Id, Charactername, Faction FROM characters
   WHERE Faction>0
   UNION
   SELECT Id, Charactername, Faction FROM characters
   WHERE Faction=0
)
select *
from cte
order by Faction, id, Charactername

如果UNION的使用不是强制性的,您也可以尝试:

select id, Charactername, Faction
from characters
where Faction >= 0
order by Faction, id, Charactername

答案 2 :(得分:0)

我认为你只想要正确的order by

SELECT Id, Charactername, Faction
FROM characters
ORDER BY (CASE WHEN faction > 0 THEN 1 ELSE 2 END), CharacterName;

根本不需要WHEREUNION