我有一个查询,我试图了解它正在做什么
查询是:
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
关于发生了什么事的任何帮助?
由于
答案 0 :(得分:2)
据我所知,当shippingdate列中存在空值时,它将按orderid排序
这不会发生什么。这里的目的是确保所有具有shippeddate
值的记录显示在没有值的记录之前。
答案 1 :(得分:2)
您的查询按2列排序,首先是基于shippeddate
null
或date
的计算值,其次是实际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
)