我无法理解这个案例是如何正常运行的,我有一个名为sales的表,这是我如何查询它,这是输出的一个小片段,我试图从一本sql书中做一个挑战
use TSQL2012
select custid,orderid, shippeddate
from sales.orders
这是输出(小部分)
85 10248 2006-07-16 00:00:00.000
79 10249 2006-07-10 00:00:00.000
34 10250 2006-07-12 00:00:00.000
80 11069 2008-05-06 00:00:00.000
44 11070 NULL
46 11071 NULL
所以我必须要做的是获取客户ID(custid)为20的所有行,并按升序排序,最后将NULL放在发货日期。这就是我试图做的事情:
select orderid, shippeddate
from sales.orders
where custid = 20
order by
case when shippeddate is null then shippeddate end desc,
case when shippeddate is not null then shippeddate end asc
它绝对没有返回,所以在我破解后我决定在互联网上寻找解决方案,就是这样:
use TSQL2012
select orderid, shippeddate
from sales.orders
where custid = 20
order by case
when shippeddate is null then 1 else 0 end, shippeddate ;
1和0应该做什么?它们不是真/假,它们不是序数位置,它们如何分别取代desc
asc
?我对SQL很陌生,对不起“解释我代码cos'我太愚蠢的问题”
答案 0 :(得分:3)
您可以将构造case when shippeddate is null then 1 else 0 end
视为派生列,它不会通过选择列表返回给客户端,而是用于排序。
你可以这样看:
select orderid, shippeddate, case when shippeddate is null then 1 else 0 end as [SortCol1]
from sales.orders
where custid = 20
order by SortCol1, shippeddate;