How do I order by NULLS LAST if my database doesn't support it?

liz*_*y81 8 sql-server-2008 null sql-server order-by

Select      FullName, Login 
FROM        [User]
ORDER BY    FullName desc, login asc
Run Code Online (Sandbox Code Playgroud)

Results

Select      FullName, Login 
FROM        [User]
ORDER BY    FullName desc, login asc
Run Code Online (Sandbox Code Playgroud)

What I want

FullName                      Login
----------------------------- ------------------------------
M...... H.........            mh..@...com
A.... H.....                  ad..@...com
NULL                          and..@...com
NULL                          ben..@...com
NULL                          roc..@...com
Run Code Online (Sandbox Code Playgroud)

I want the full name in abc order desc and same with login, but I want all nulls to go to the bottom.

Mar*_*ith 28

NULLS LAST在 SQL Server 中有一个(关闭的)连接项目请求支持。

其他几种方式是

ORDER BY 
        CASE WHEN FullName IS NULL THEN 1 ELSE 0 END, 
        FullName,
        Login
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个,因为它不依赖于对假设没有合法数据进行排序的字符串进行硬编码。我宁愿不必考虑在某些区分大小写的排序规则中 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 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Ken*_*her 8

 Select      FullName, Login 
 FROM        [User]
 ORDER BY    CASE WHEN FullName IS NULL THEN 'ZZZZZZZ' ELSE FullName END, login asc
Run Code Online (Sandbox Code Playgroud)

  • 你的“CASE”可以用“COALESCE”来缩短。 (4认同)
  • @MartinSmith 我同意。`COALESCE` 或 `ISNULL` 会更短。我更喜欢你的回答。最好将 NULL 部分完全拉出。 (2认同)