问题表述


数据库表如下:

id student
1 Abbot
2 Doris
3 Emerson
4 Green
5 Jeames

现在要通过SQL语句将表变换成如下:

id student
1 Doris
2 Abbot
3 Green
4 Emerson
5 Jeames

即id不变,奇数位和偶数位交换位置,如果表的总行数为奇数,则最后一行不变。

问题解决


首先看到这个问题,我就想SQL里面是不是有什么置换函数之类的,结果去查了查,并没有这样的函数。在我尝试了各种select方法后,还是没能将这题解出来…最后还是去讨论区看了看大神们的解答,看完各种答案后瞬间豁然开朗。

这题的解题思路其实并不是想办法将student的列置换,而是通过操作id列来达到置换的效果。

比较通过的解法就是下面这种:

select
if(id < (select count(*) from seat), if(id mod 2=0, id-1, id+1), if(id mod 2=0, id-1, id)) as id, student
from seat
order by id asc

其中IF函数的用法:

格式:IF(Condition,A,B)

意义:当Condition为TRUE时,返回A;当Condition为FALSE时,返回B。

所以上面的SQL语句就是,先对id进行操作。先计算总行数,最后一行如果是奇数id不变,如果是偶数id减1,其余行id为奇数的让id加1,id为偶数的让id减1,最后再对id做升序操作,就可以得到结果了。

其中还有一种解法:

/* get all the even numbered rows as odd numbered rows */
SELECT s1.id - 1 as id, s1.student
FROM Seat s1
WHERE s1.id MOD 2 = 0 UNION /* get all the odd numbered rows as even numbered rows */
SELECT s2.id + 1 as id, s2.student
FROM Seat s2
WHERE s2.id MOD 2 = 1 AND s2.id != (SELECT MAX(id) FROM Seat)
/* Just don't get the last row as we will handle it in the next UNION */ UNION /* get the last row if odd and don't change the id value */
SELECT s3.id, s3.student
FROM Seat s3
WHERE s3.id MOD 2 = 1 AND s3.id = (SELECT MAX(id) FROM Seat) /* Order the result by id */
ORDER BY id ASC;

思路都和第一种方法大同小异。

最新文章

  1. iOS引入JavaScriptCore引擎框架(一)
  2. 夺命雷公狗----Git---7---GitHub当仓库本地使用(完)
  3. 框架SpringMVC笔记系列 二 传值
  4. Laravel之Service Container服务容器
  5. 利用HTML5开发Android(1)---Android设备多分辨率的问题
  6. 持久化框架Hibernate 开发实例(二)
  7. overflow:hidden真的失效了吗
  8. struts2 json 定义全局Date格式
  9. C#中Split分隔字符串的应用(C#、split、分隔、字符串)
  10. Oracle进阶研究问题收集
  11. python基础教程(六)
  12. Docker最全教程——MongoDB容器化(十二)
  13. NetSarang软件中nssock2.dll模块被植入恶意代码技术分析与防护方案
  14. 浏览器h5新建文件 保存到本地(相当于浏览器写文件)
  15. sqlserver2008 传入的表格格式数据流(tds)协议流不正确。
  16. 洛谷P4169 天使玩偶 CDQ分治
  17. js 计算后样式封装
  18. jmeter插件使用说明
  19. 20165205 学习基础与C语言基础调查
  20. 对于devexpress gridview 内插图加加进度条等的一点解读

热门文章

  1. 关闭Wind XP/Vista/Win7的DEP数据执行保护汇总(转)
  2. OpenCV图像的基础叠加
  3. c语言bit倒置最好的算法-离msb-lsb至lsb-msb
  4. CentOS(一) 最小化安装
  5. Leetcode 94 Binary Tree Inorder Traversal 二叉树
  6. Leetcode 104 Maximum Depth of Binary Tree 二叉树
  7. WPF用Blend写的交通信号灯
  8. 【C#】获取&quot;我的电脑&quot;的名字,如This PC、这台计算机
  9. wpf 禁用window的systemmenu
  10. 图像滤镜艺术--PS平均(滤镜-模糊-平均)效果