簡體   English   中英

T-SQL:需要一種方法將NULL排序到結果集的頂部

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM