ORDER BY 0错误输出

时间:2015-01-21 05:57:16

标签: sql sql-server sql-server-2012

我有一个查询,我试图了解它正在做什么

查询是:

SELECT orderid, 
       shippeddate 
FROM   Sales.Orders 
ORDER  BY ( CASE 
              WHEN [shippeddate] IS NULL THEN 1 
              ELSE 0 
            END ), 
          [shippeddate] 

我理解当shippingdate列中存在空值时,它将按orderid排序 但是我不理解Else的情况,订单bY 0做了什么,因为当我试图在没有Case语句的情况下使用它时,如下面的查询,它出错了:

        SELECT orderid, shippeddate
        FROM Sales.Orders
        ORDER BY 0

关于发生了什么事的任何帮助?

由于

3 个答案:

答案 0 :(得分:2)

  

据我所知,当shippingdate列中存在空值时,它将按orderid排序

会发生什么。这里的目的是确保所有具有shippeddate值的记录显示在没有值的记录之前。

答案 1 :(得分:2)

您的查询按2列排序,首先是基于shippeddate nulldate的计算值,其次是实际shippeddate

CASE WHEN [shippeddate] IS NULL THEN 1 
     ELSE 0 
END 

ORDER BY的第一部分有效地为每行创建一个新的计算列,只将NULL日期值存储为1,将有效日期存储为0。< / p>

所以这个数据:

id  | shippeddate
----|------------
 1  | null
 2  | null
 3  | 2015-01-21
 4  | 2015-01-18

case语句将产生以下一组值:

id  | shippeddate | order_col (hidden)
----|-------------|-------------------
 1  | null        | 1
 2  | null        | 1
 3  | 2015-01-21  | 0
 4  | 2015-01-18  | 0

因此,如果您在隐藏列中按此计算值排序,则0值将出现在1值之前。因此有效日期将在NULL值之前出现。

第二个ORDER BY[shippeddate]只是对日期进行排序,因此输出结果如下:

id  | shippeddate | order_col (hidden)
----|-------------|-------------------
 4  | 2015-01-18  | 0
 3  | 2015-01-21  | 0
 1  | null        | 1
 2  | null        | 1

答案 2 :(得分:0)

按1排序表示按列1进行排序。

当你尝试ORDER BY 1时,它需要第一列

以同样的方式尝试执行ORDER BY 0时会因为没有列No.0而导致错误。 因为没有Zeroth专栏。

尝试使用它。

 SELECT orderid, shippeddate
     FROM Sales.Orders
     ORDER BY 
             (
            CASE 
            WHEN [shippeddate] IS NULL THEN 1
            ELSE
            [shippeddate]
            END
             )