我正在运行一个包含存储在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等中使用子查询 - 并试图根据我自己的独特情况调整它们,但我总是遇到逻辑或解析错误我似乎无法安顿下来。
有没有人有一个优雅的解决方案?谢谢!
如果您需要,我可以提供该网站的网址,但我一开始并不想,因为这似乎是在一个不适合此目的的网站上进行的公然自我推销。
答案 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;
根本不需要WHERE
或UNION
。