题目:小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。其中纵列的id是连续递增的小美想改变相邻俩学生的座位。
注意:如果学生人数是奇数,则不需要改变最后一个同学的座位。
-- 创建seat表
CREATE TABLE seat(
id int(4) not NULL,
student VARCHAR(10) not NULL
);
-- 插入数据
INSERT INTO seat VALUE(1,'Abbot');
INSERT INTO seat VALUE(2,'Doris');
INSERT INTO seat VALUE(3,'Emerson');
INSERT INTO seat VALUE(4,'Green');
INSERT INTO seat VALUE(5,'Jeames');
-- 解法1:使用UNION凭借查询结果
SELECT
*
FROM
(-- id为偶数则id-1 --
SELECT
id - 1 AS id,
student
FROM
seat
WHERE
id % 2 = 0 UNION ALL
SELECT-- id为非最大奇数则id加1 --
id + 1 AS id,
student
FROM
seat
WHERE
id % 2 <> 0
AND id <(
SELECT
max( id )
FROM
seat
) UNION ALL
SELECT -- 查找最后一个id,且为奇数 --
*
FROM
seat
WHERE
id =(
SELECT
max( id )
FROM
seat
)
AND id % 2 <> 0
) AS temp
ORDER BY
id;
-- 解法2:使用CASE条件分支判断查询
SELECT
(
CASE
WHEN id%2= 1 AND id != ( SELECT MAX( id ) FROM seat ) THEN id + 1
WHEN id%2= 0 THEN id - 1
ELSE id
END
) AS id,
student
FROM
seat
ORDER BY
id;
两种查询语句查询结果如下:
总结:本题的知识点就是CASE条件分支,在不知道CASE之前,我使用了最笨的一种方法,分别查询出奇数、偶数及最后一位的id再对id值进行调整(奇数加1,偶数减1,最后一id值位不变),最后再将查询结果进行UNION拼接并ORDER BY升序排序,语句过于繁琐冗长,其意思跟使用解法2中的CASE条件分支查询一样。