表employee:
+-----+-----------+
| eno | ename |
+-----+-----------+
| 1 | 小李 |
| 2 | 小王 |
| 3 | 小刚 |
| 4 | 小虎 |
+----+------------+
表employee:
+-----+-----------+
| eno | ename |
+-----+-----------+
| 1 | 小李 |
| 2 | 小王 |
| 3 | 小刚 |
| 4 | 小虎 |
+----+------------+
SELECT
ROW_NUMBER() OVER(ORDER BY(eno+1-2*POWER(0,eno%2))) AS eno,ename
FROM employee
SELECT
ROW_NUMBER() OVER(ORDER BY(eno-1+2*MOD(0,eno%2))) AS eno,ename
FROM employee
SELECT
IF(eno%2=0,eno-1,
IF(eno=(SELECT COUNT(DISTINCT eno) FROM employee),eno,eno+1))
AS eno,ename
FROM employee
ORDER BY eno
SELECT
IF(eno%2=0,eno+1,
IF(eno=(SELECT COUNT(DISTINCT eno) FROM employee),eno,eno-1))
AS eno,ename
FROM employee
ORDER BY eno
1+1-2*0^1=2 小赵
2+1-2*0^0=1 小钱
3+1-2*0^1=4 小孙
4+1-2*0^0=3 小李
5+1-2*0^1=6 小周
在开窗排序之后
1 小钱
2 小赵
3 小李
4 小孙
B选项中的eno-1+2*MOD(0,eno%2) 表示
(eno为偶数的时候,这里对应的第2和第4行使用mod求余的时候被除数为0,所以结果为null,mysql中默认空值最小,开窗升序排序的时候会排在最前)
1-1+2*0=0 小赵
2-1+2*null=null 小钱
3-1+2*0=2 小孙
4-1+2*null=null 小李
5-1+2*0=4 小周
开窗排序之后
1 小钱
2 小李
3 小赵
4 小孙
5 小周 所以B选项是有问题的
C选项中的IF(eno%2=0,eno-1,
IF(eno=(SELECT COUNT(DISTINCT eno) FROM empl),eno,eno+1))
这个表示如果是偶数行eno-1,奇数行就eno+1,最后一行是奇数则eno不变
1 2 3 4 5就变成2 1 4 3 5 在最后order by排序之后这个结果是没问题的
C选项这个结果就完全符合题意。
至于D选项IF(eno%2=0,eno+1,
IF(eno=(SELECT COUNT(DISTINCT eno) FROM empl),eno,eno-1))