我想了解CASE WHEN的ORDER BY。
我的目的是从根本上理解它,因为我创建了不同的用例
我的基本表如下
| Name |
|--------|
| BPM |
| BXR |
| Others |
| XZA |
| XYZ |
| PQR |
| ABC |
查询1:基本ORDER BY
SELECT *
FROM City
ORDER BY Name
查询1结果:给出如下正确输出(名称列按升序排列)
| Name |
|--------|
| ABC |
| BPM |
| BXR |
| Others |
| PQR |
| XYZ |
| XZA |
查询2:我最后要
Others
SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'Others' THEN 1
ELSE 0
END
查询2结果:我得到了部分正确的结果。我最后得到了
Others
,但我希望其他names
升序排列。它们实际上以它们在基表中的显示方式出现。| Name |
|--------|
| BPM |
| BXR |
| XZA |
| XYZ |
| PQR |
| ABC |
| Others |
我也没有理解
0
和1
在ORDER BY
语句中的实际含义。查询3:我最后要
BXR
和Others
。 SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'BXR' THEN 1
WHEN Name = 'Others' THEN 2
ELSE 0
END
查询3结果:我得到了部分正确的结果。我最后得到了'Others'和'BXR',但是其他
Name
不是按字母顺序排列的,与查询2相同,这里我也不了解,0
,1
| Name |
|--------|
| BPM |
| XZA |
| XYZ |
| PQR |
| ABC |
| BXR |
| Others |
查询4:我想要
2
和Others
在顶部。SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'PQR' THEN 0
WHEN Name = 'Others' THEN 1
ELSE 2
END
查询4结果:我在顶部得到
PQR
和PQR
,但是其余名称不是按字母顺序排列的。| Name |
|--------|
| PQR |
| Others |
| BPM |
| BXR |
| XZA |
| XYZ |
| ABC |
我对
Others
,0
,1
的假设是,它们只是决定记录应位于的“顺序”的数字。(具有0的记录应首先保留,如果所有其他记录具有1,则应按字母顺序排序)
(如果在具有
2
的记录中存在'0','1','2',则应排在首位,具有0
的记录应排在第二,所有具有1
的其他记录应按字母顺序排序)如果我错了,请纠正我
SQLFiddle
最佳答案
您还需要按以下顺序添加名称
DEMO
SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'PQR' THEN 0
WHEN Name = 'Others' THEN 1
ELSE 2
END,name
输出:
**Name**
PQR
Others
ABC
BPM
BXR
XYZ
XZA