如何按大于0的列然后按日期排序

时间:2018-03-13 14:07:17

标签: sql sql-server ssms

假设我有一个名为Car的表,其中包含Age和CreationDate列。

我现在想要订购,以便所有年龄大于0的汽车先排序,然后按creationDate按降序排序。因此,如果汽车的年龄是4,6,7,例如它大于0,则无关紧要。这意味着基本上所有行都按CreationDate排序,除了所有年龄大于0的汽车都是排序第一。

例如,下面的代码不起作用,因为汽车首先按年龄排序,并忽略实际的CreationDate。 (我不想反转它并首先使用CreationDate,因为那时年龄> 0的汽车将不会首先列出。)

SELECT * FROM Car ORDER BY Age, CreationDate DESC

非常感谢任何帮助或意见,谢谢!

3 个答案:

答案 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