我想了解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 |


我也没有理解01ORDER BY语句中的实际含义。

查询3:我最后要BXROthers

 SELECT *
    FROM City
    ORDER BY CASE
             WHEN Name = 'BXR' THEN 1
             WHEN Name = 'Others' THEN 2
             ELSE 0
             END


查询3结果:我得到了部分正确的结果。我最后得到了'Others'和'BXR',但是其他Name不是按字母顺序排列的,与查询2相同,这里我也不了解,01

|   Name |
|--------|
|    BPM |
|    XZA |
|    XYZ |
|    PQR |
|    ABC |
|    BXR |
| Others |


查询4:我想要2Others在顶部。

SELECT *
FROM City
ORDER BY CASE
         WHEN Name = 'PQR' THEN 0
         WHEN Name = 'Others' THEN 1
         ELSE 2
         END


查询4结果:我在顶部得到PQRPQR,但是其余名称不是按字母顺序排列的。

|   Name |
|--------|
|    PQR |
| Others |
|    BPM |
|    BXR |
|    XZA |
|    XYZ |
|    ABC |


我对Others01的假设是,它们只是决定记录应位于的“顺序”的数字。
(具有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

09-25 18:21