SQL 服务器:使用 ORDER BY 子句对 NULL 标记进行排序
SQL Server : sorting NULL Marks with ORDER BY clause
我有这个问题:
SELECT orderid, shippeddate
FROM Sales.Orders
WHERE custid = 20
ORDER BY shippedate;
输出为:
orderid shippeddate
------- -----------
11008 NULL
11072 NULL
10258 2006-07-23 00:00:00.000
10263 2006-07-31 00:00:00.000
10351 2006-11-20 00:00:00.000
10368 2006-12-02 00:00:00.000
...
作为练习,我试图弄清楚如何按 shippeddate
升序对订单进行排序,但将 NULL 排序在最后。
我知道 standard SQL
支持选项 NULL FIRST
和 NULL LAST
,但 T-SQL
不支持此选项。
有什么建议吗?
谢谢
你可以这样做:
SELECT orderid, shippeddate
FROM Sales.Orders
WHERE custid = 20
ORDER BY case when shippeddate is null then 2 else 1 end, shippedate;
此外,
如果该字段为空,您可以使用 ISNULL
替换该字段中的值
ISNULL ( check_expression , replacement_value )
所以您的查询看起来像这样
SELECT ISNULL(orderid, '1900-01-01'),
shippeddate
FROM Sales.Orders
WHERE custid = 20
ORDER BY shippedate asc;
因此,这会将该字段中的任何 NULL 替换为您可以排序的值(在本例中为 1900-01-01)
我有这个问题:
SELECT orderid, shippeddate
FROM Sales.Orders
WHERE custid = 20
ORDER BY shippedate;
输出为:
orderid shippeddate
------- -----------
11008 NULL
11072 NULL
10258 2006-07-23 00:00:00.000
10263 2006-07-31 00:00:00.000
10351 2006-11-20 00:00:00.000
10368 2006-12-02 00:00:00.000
...
作为练习,我试图弄清楚如何按 shippeddate
升序对订单进行排序,但将 NULL 排序在最后。
我知道 standard SQL
支持选项 NULL FIRST
和 NULL LAST
,但 T-SQL
不支持此选项。
有什么建议吗?
谢谢
你可以这样做:
SELECT orderid, shippeddate
FROM Sales.Orders
WHERE custid = 20
ORDER BY case when shippeddate is null then 2 else 1 end, shippedate;
此外,
如果该字段为空,您可以使用 ISNULL
替换该字段中的值ISNULL ( check_expression , replacement_value )
所以您的查询看起来像这样
SELECT ISNULL(orderid, '1900-01-01'),
shippeddate
FROM Sales.Orders
WHERE custid = 20
ORDER BY shippedate asc;
因此,这会将该字段中的任何 NULL 替换为您可以排序的值(在本例中为 1900-01-01)