[英]T-SQL: Need a way to sort NULLs to top of a resultset
場景:
我有一個簡單的SELECT
查詢,它從一個表中檢索數據,按日期字段排序(這里的日期字段表示類似“結束日期”)。 應用程序邏輯是,如果此“結束日期”為NULL,則記錄指示當前事件。 現在,這些記錄顯示在按此結束日期排序的列表中,以便最新的記錄顯示在頂部。
顯然,由於應用程序將NULL日期記錄視為“當前”,因此它們必須位於此記錄列表之上。 如何讓SQL Server 2012將它們排序到列表頂部? 注意 - 您可以在ORDER BY中使用偽(虛擬)值,但不能在SELECT部分中選擇此偽值。
這是我當前的查詢(它不處理NULL,“ContractEndDate”是我們感興趣的日期字段):
SELECT
[Id], [UserName], [ContractEndDate]
FROM
[UserContracts]
ORDER BY
[ContractEndDate] DESC
任何指針都很有用。
按以下條件添加主要訂單:
order by case when ContractEndDate is null then 0 else 1 end, ContractEndDate
SELECT Id, UserName, ISNULL(ContractEndDate,GETDATE())
FROM UserContracts
ORDER BY ISNULL(ContractEndDate,GETDATE()) DESC
您可以創建動態訂單列,然后根據該列進行排序,然后按日期進行排序
;with CTE as (Select Id,Dt, (Case when Dt IS null then 0 else 1 end) OrderId
from Temp)
Select *
FRom CTE
Order by OrderId, Dt
這是小提琴樣本
為簡單起見,我們可以采用偽列,這是CASE語句,並按此偽列排序。
SELECT
[Id], [UserName], [ContractEndDate]
FROM
[UserContracts]
ORDER BY
(CASE WHEN [ContractEndDate] IS NULL THEN 0 ELSE 1 END), [ContractEndDate]
DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.