626
交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。按 id
升序 返回结果表。
表: Seat
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | student | varchar | +-------------+---------+
普通版:case when
select (
case when id%2 = 1 and id = (select count(*) from seat) then id
when id%2 = 1 then id+1
else id-1 end) id, student
from seat
order by id;
高级版:位运算 coalesce()
select s1.id id, coalesce(s2.student, s1.student) student
from seat s1 left join seat s2 on (s1.id + 1)^1-1 = s2.id
order by s1.id
位运算:^(位异或)
将两数采用二进制进行运算,相同为0,相异为1
coalesce函数:coalesce(value1, value2, ..., valueN)
可以有多个备选值,返回备选值中第一个非空值;
若所有的表达式都是空值,最终将返回一个空值。
此处使用 coalesce() 函数为最后一行记录生成正确的输出。