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
语句首先排序,因此如果任何内容在 Childs
或 Pets
中具有 NULL 值,那么它将被推到底部。 Childs_Pets
的顺序在后面,并根据需要对 ASC
进行排序。
我对订购 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
语句首先排序,因此如果任何内容在 Childs
或 Pets
中具有 NULL 值,那么它将被推到底部。 Childs_Pets
的顺序在后面,并根据需要对 ASC
进行排序。