假设我有一个名为Car的表,其中包含Age和CreationDate列。
我现在想要订购,以便所有年龄大于0的汽车先排序,然后按creationDate按降序排序。因此,如果汽车的年龄是4,6,7,例如它大于0,则无关紧要。这意味着基本上所有行都按CreationDate排序,除了所有年龄大于0的汽车都是排序第一。
例如,下面的代码不起作用,因为汽车首先按年龄排序,并忽略实际的CreationDate。 (我不想反转它并首先使用CreationDate,因为那时年龄> 0的汽车将不会首先列出。)
SELECT * FROM Car ORDER BY Age, CreationDate DESC
非常感谢任何帮助或意见,谢谢!
答案 0 :(得分:5)
您可以使用CASE
表达式:
SELECT *
FROM Car
ORDER BY CASE WHEN Age > 0 THEN 1 ELSE 2 END,
CreationDesc DESC
;
答案 1 :(得分:1)
SELECT
*
FROM
Car AS C
ORDER BY
CASE
WHEN C.Age > 0 THEN 1 -- All ages above 0 will get a value "1"
ELSE 999 END -- The rest will have value "999"
ASC, -- The order is ascendent, so "1" will go first and "999" second
C.CreationDate DESC
答案 2 :(得分:0)
使用CASE
表达式作为其他答案建议,尽管有效,但不会使用应用于列的任何适用SORT
的{{1}}顺序进行查询。那不是SARGable。引擎将使用INDEX
运算符,这是一个阻塞运算符,因此性能不佳。查看Itzik Ben-Gan最近的PASS视频
像这样拆分查询效果更好,会在适用的SORT
上使用SEEK
两次。
INDEX