[SQL] LeetCode 626. 换座位 - [Medium]
题目:
小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?
示例:
+---------+---------+ | id | student | +---------+---------+ | 1 | Abbot | | 2 | Doris | | 3 | Emerson | | 4 | Green | | 5 | Jeames | +---------+---------+
假如数据输入的是上表,则输出结果如下:
+---------+---------+ | id | student | +---------+---------+ | 1 | Doris | | 2 | Abbot | | 3 | Green | | 4 | Emerson | | 5 | Jeames | +---------+---------+
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
SQL架构:
Create table If Not Exists seat(id int, student varchar(255)); Truncate table seat; insert into seat (id, student) values (1, Abbot); insert into seat (id, student) values (2, Doris); insert into seat (id, student) values (3, Emerson); insert into seat (id, student) values (4, Green); insert into seat (id, student) values (5, Jeames);
解题语句:
方法一:CASE 函数
思路:
- 更改 id 值的方式实现交换
- id 为偶数时,偶数 id = id - 1
- id 为奇数时(最后一个id为奇数时),最后一个 id 值不变
- id 为奇数时(最后一个id为偶数时),奇数 id = id + 1
- id 重新排序,完成交换
SELECT CASE WHEN id % 2 = 0 THEN id - 1 WHEN id % 2 = 1 AND id = ( SELECT COUNT( * ) FROM seat ) THEN id ELSE id + 1 END AS id, student FROM seat ORDER BY id;
方法二:IF 函数
思路:
- 将最后一项 id 单独考虑
- 除去最后一个 id,偶数 id - 1,奇数 id + 1
- 对于最后一个 id:偶数 id - 1,奇数 id 不变
SELECT IF( id < ( SELECT count( * ) FROM seat ), IF( id % 2 = 0, id - 1, id + 1 ), IF( id % 2 = 0, id - 1, id ) ) AS id, student FROM seat ORDER BY id;
