SQL table ORDER BY(底部为空字段)

SQL table ORDER BY (empty fields at bottom)

我对订购 SQL table 有疑问。我已经尝试了几件事,但找不到我想要的解决方案。

我的 table 看起来如下:

username  childs+pets  childs    pets
=======================================
Max       1                      1
Nico      3            1         2       
Lewis     2            2        
Daniel    2            1         1

我想按 childs+pets(升序)排序我的 table,但我想将带有空字段(Max 和 Lewis)的记录放在 table 的底部。结果是:

username  childs+pets  childs    pets
=======================================
Nico      3            1         2
Daniel    2            1         1       
Lewis     2            2        
Max       1                      1

谁能帮帮我?

样本不够清晰,二选一:

select      *

from        t

order by    "childs+pets" + 0  desc
           ,case when childs = '' then 2 else 1 end
           ,case when pets   = '' then 2 else 1 end
;          

select      *

from        t

order by    case when childs = '' then 2 else 1 end
           ,case when pets   = '' then 2 else 1 end
           ,"childs+pets" + 0 desc
;        

最简单的解决方案(适用于 Null 值)就是:

select * 
from mytable
order by coalesce(childs+pets, 9999)

或者,正如您所说的空值是零字符串,您也可以使用 :

select * 
from mytable
order by case when childs = '' or pets = '' then '9999' else childs+pets end

这是一个适用于 SQL 服务器的解决方案。我还假设 Childs+Pets 是来自两个单独字段的计算字段。

测试数据;

CREATE TABLE #TestData (Username nvarchar(10), Childs int, Pets int)
INSERT INTO #TestData (Username, Childs, Pets)
VALUES
('Max',NULL,1)
,('Nico', 1,2)
,('Lewis',2,NULL)
,('Daniel',1,1)

查询

SELECT
    td.Username
    ,COALESCE(td.Childs,0) + COALESCE(td.Pets,0) Childs_Pets --The coalesce returns a Zero if the field contains a NULL
    ,td.Childs
    ,td.Pets
FROM #TestData td
ORDER BY CASE WHEN td.Childs IS NULL OR td.Pets IS NULL THEN 0 ELSE 1 END DESC
,COALESCE(td.Childs,0) + COALESCE(td.Pets,0) ASC

输出

Username    Childs_Pets     Childs      Pets
Daniel      2               1           1
Nico        3               1           2
Max         1               NULL        1
Lewis       2               2           NULL

CASE 语句首先排序,因此如果任何内容在 ChildsPets 中具有 NULL 值,那么它将被推到底部。 Childs_Pets 的顺序在后面,并根据需要对 ASC 进行排序。