ORDER BY子句中CASE表达式的行排序逻辑及结果疑问
理解ORDER BY子句中CASE表达式的排序逻辑
样本数据
CREATE TABLE demo_table ( ID INT, NAME VARCHAR(20), APPLE INT, ORANGE INT ); INSERT INTO demo_table VALUES (1, 'John', 45, 7), (2, 'Greg', 20, 25), (3, 'Alex', 22, 29), (4, 'Paul', 50, 55), (5, 'Bob', 40, 13);
执行的SQL查询
SELECT * FROM demo_table ORDER BY CASE WHEN APPLE < ORANGE THEN APPLE ELSE ORANGE END, name DESC
查询输出结果
| ID | NAME | APPLE | ORANGE |
|---|---|---|---|
| 1 | John | 45 | 7 |
| 5 | Bob | 40 | 13 |
| 2 | Greg | 20 | 25 |
| 3 | Alex | 22 | 29 |
| 4 | Paul | 50 | 55 |
排序逻辑拆解
你疑惑第二行为什么不是ID=2的Greg,核心是先算出每一行CASE表达式的结果,再看排序顺序:
CASE表达式的规则是:如果APPLE的值小于ORANGE,就取APPLE的数值;否则取ORANGE的数值,SQL默认按这个结果升序排序,若有相同的CASE结果,再按NAME降序排列。
逐个计算每行的CASE结果:
- John(ID1):45不小于7,取ORANGE=7
- Bob(ID5):40不小于13,取ORANGE=13
- Greg(ID2):20小于25,取APPLE=20
- Alex(ID3):22小于29,取APPLE=22
- Paul(ID4):50小于55,取APPLE=50
把这些CASE结果按升序排列,顺序为7→13→20→22→50,对应到行就是John→Bob→Greg→Alex→Paul,和输出结果完全一致。因为Bob的CASE结果13比Greg的20小,所以排在Greg前面。
内容的提问来源于stack exchange,提问作者user7481254
相关产品推荐
相关产品推荐

