我正在尝试理解带有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:我希望其他
排在最后
SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'Others' THEN 1
ELSE 0
END
查询2结果:我得到了部分正确的结果。最后我得到了其他
,但是其他名称
我希望它们按照升序排列。它们实际上出现的方式与基本表中的方式相同。
| Name |
|--------|
| BPM |
| BXR |
| XZA |
| XYZ |
| PQR |
| ABC |
| Others |
我也不知道ORDER BY
语句中的0
和1
实际上是什么意思。
查询3:我希望将BXR
和Others
排在最后。
SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'BXR' THEN 1
WHEN Name = 'Others' THEN 2
ELSE 0
END
查询3结果:我部分正确,最后得到了“其他”和“BXR”,但其他名称
不按字母顺序排列。与查询2中所见相同。在这里,我还不理解0
,1
,2
的意义。
| Name |
|--------|
| BPM |
| XZA |
| XYZ |
| PQR |
| ABC |
| BXR |
| Others |
查询4:我希望其他项
和PQR
排在最前面。
SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'PQR' THEN 0
WHEN Name = 'Others' THEN 1
ELSE 2
END
查询结果 4:我得到了顶部的 PQR
和 Others
,但其余的名称没有按字母顺序排列。
| Name |
|--------|
| PQR |
| Others |
| BPM |
| BXR |
| XZA |
| XYZ |
| ABC |
我的理解是,
0
、1
、2
只是数字,用来决定记录的“顺序”。
(记录中有0的应该排在最前面,如果其他所有记录都有1,则按字母表顺序排序)
(如果记录中有'0'、'1'、'2',则带0
的记录应该排在第一位,带1
的记录应该排在第二位,其余带2
的记录应按字母表顺序排序)如果我的理解有误,请指出。 SQLFiddle链接