今天在工作中遇到一条SQL语句,学生成绩按照升序排列,但是成绩为-1(没来参加考试的学生成绩为-1)的人排在最后面。最终总结了三种写法:
select * from table order by score = -1 asc , score asc
select * from table order by field(score , -1) asc , score asc
select * from table order by (case score when -1 then 1 else 0 end) asc , score asc
三种写法主要区别在判断条件
写法一中根据score = -1
判断,当成绩为-1时,判断条件值为1,否则为0,通过升序排列将成绩为-1的数据排在最下面,然后根据成绩排序。
写法二中运用field(str,str1,str2)
方法,该方法将str字段的值与str1和str2分别进行匹配,匹配权重为1,2…依次递增,没有匹配的权重为0。在该语句中将score的值与-1进行匹配,此时-1成绩对应的权重为1,正常成绩对应权重为0,通过升序排列将成绩为-1的数据排在最下面,然后根据成绩排序。
写法三中运用case ... when ... else ... end
方法进行选择,将-1成绩置为1,正常成绩置为0,通过升序排列将成绩为-1的数据排在最下面,然后根据成绩排序。
三种方法中写法一速度最快。