Sql-Server

如果我的數據庫不支持,我如何按 NULLS LAST 排序?

  • December 9, 2020
Select      FullName, Login 
FROM        [User]
ORDER BY    FullName desc, login asc

結果

FullName                      Login
----------------------------- ------------------------------
M...... H.........            mh..@...com
A.... H.....                  ad..@...com
NULL                          and..@...com
NULL                          ben..@...com
NULL                          roc..@...com

我想要的是

FullName                      Login
----------------------------- ------------------------------
A.... H.....                  ad..@...com
M...... H.........            mh..@...com
NULL                          and..@...com
NULL                          ben..@...com
NULL                          roc..@...com

我想要 abc order desc 中的全名,並且與 login 相同,但我希望所有空值都到底部。

Select      FullName, Login 
FROM        [User]
ORDER BY    CASE WHEN FullName IS NULL THEN 'ZZZZZZZ' ELSE FullName END, login asc

SQL Server 中有一個(關閉的)連接項請求支持NULLS LAST

其他幾種方法是

ORDER BY 
       CASE WHEN FullName IS NULL THEN 1 ELSE 0 END, 
       FullName,
       Login

我更喜歡這個,因為它不依賴硬編碼一個假定沒有合法數據會排序的字元串。我寧願不必考慮在某些區分大小寫的排序規則中 z 在 Z 之前排序,而在其他排序規則中則相反,這會是一個問題嗎?同樣,“ Željko Ivanek”是否會在所有排序規則中可靠地排序在“ZZZZZZZ”之前?是否有來自其他語言的其他字元可能存在於名稱中並在“Z”之後排序?

如果有索引,則可能是更有效的解決方案FullName, Login(因為它有望避免排序)

CREATE TABLE [User]
 (
    FullName VARCHAR(100),
    Login    VARCHAR(100),
    INDEX IX (FullName,Login) /*Use separate create index if < 2014*/
 );

WITH T
    AS (SELECT 1 AS Grp,
               *
        FROM   [User]
        WHERE  FullName IS NOT NULL
        UNION ALL
        SELECT 2 AS Grp,
               *
        FROM   [User]
        WHERE  FullName IS NULL)
SELECT FullName,
      Login
FROM   T
ORDER  BY Grp,
         FullName,
         Login 

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/140363