按ASC排序,底部为空

Dav*_*ong 38 mysql sql sql-order-by

我正在编写一个将学校表连接到地区表的SQL查询.简单的一对多关系,每所学校都隶属于一个学区.我的查询如下:

SELECT 
    schools.id AS schoolid,
    schools.name AS school, 
    districts.id AS districtid, 
    districts.name AS district
FROM sms_schools AS schools
    LEFT JOIN sms_districts AS districts ON schools.districtid = districts.id
WHERE 1 = 1
ORDER BY districts.name, schools.name
Run Code Online (Sandbox Code Playgroud)

我做左派的原因是因为不是每个学校都附属于一个学区.例如,一所学校可能是家庭教育,可能包含所有在家接受教育的学生.那不会是在一个地区.

所以我想要做的是使用ORDER BY来按地区名称和学校名称进行排序.唯一的问题是我希望null区位于底部,以便我可以在输出结束时使用一个名为"Other"的组.

是否可以通过在输出结尾处以空值递增来进行排序?

Dav*_*ong 38

询问问题后仅1分钟我就找到了答案.使用order by子句使用case来使null具有比其他任何值更高的值:

 ORDER BY (CASE WHEN districts.id IS NULL then 1 ELSE 0 END),districts.name, schools.name;
Run Code Online (Sandbox Code Playgroud)


tox*_*lot 25

你可以使用这个ISNULL()功能.

MySQL手册:

ISNULL(expr)

如果exprNULL,则ISNULL()返回1,否则返回0.

例如:

ORDER BY ISNULL(districts.name), districts.name, schools.name
Run Code Online (Sandbox Code Playgroud)

我喜欢使用它而不是CASEMySQL 的选项.请注意,它不是可移植的,因为ISNULL()它不是标准SQL,并且在其他SQL版本中的功能不同.


M.R*_*.R. 5

默认情况下,Null位于顶部,但您可以使用IsNull指定默认值,这将使其处于您需要的位置...


SELECT schools.id AS schoolid,schools.name AS school, districts.id AS districtid, districts.name AS district FROM sms_schools AS schools LEFT JOIN sms_districts AS districts ON schools.districtid = districts.id WHERE 1 = 1 
ORDER BY isnull(districts.name,'1'), schools.name