SQL Order By使用case when语句

4

我正在尝试理解带有CASE WHENORDER 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语句中的01实际上是什么意思。

查询3:我希望将BXROthers排在最后。

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

查询3结果:我部分正确,最后得到了“其他”和“BXR”,但其他名称不按字母顺序排列。与查询2中所见相同。在这里,我还不理解012的意义。

|   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:我得到了顶部的 PQROthers,但其余的名称没有按字母顺序排列。

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

我的理解是,012只是数字,用来决定记录的“顺序”。 (记录中有0的应该排在最前面,如果其他所有记录都有1,则按字母表顺序排序) (如果记录中有'0'、'1'、'2',则带0的记录应该排在第一位,带1的记录应该排在第二位,其余带2的记录应按字母表顺序排序)
如果我的理解有误,请指出。 SQLFiddle链接
3个回答

4

您需要在order by中添加名称

演示

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

1
感谢您的帮助 :) - sql_learner
只是一个快速的问题:当我已经在CASE WHEN中指定名称时,为什么我需要显式添加名称? - sql_learner
1
@sql_learner,因为你需要其他名称按字母顺序排列。 - Fahmi

2
我们也可以使用 FIELD 进行 ORDER BY
SELECT * 
FROM City
ORDER BY FIELD(Name, 'Others', 'PQR') DESC, name;

在此输入图片描述

演示

FIELD的行为是这样的,它将返回1表示Others,2表示PQR,对于任何其他名称则返回0。因此,我们使用降序确保PQR首先出现,然后是Others,最后是所有其他名称。


感谢提供另一种方法。 - sql_learner

2
您可以在else分支中保留name列,如下所示:
SELECT * 
FROM City
ORDER BY CASE
         WHEN Name = 'PQR' THEN 0
         WHEN Name = 'Others' THEN 1
         ELSE Name
         END

自古以来,数字优先于字母。 < p > SQL Fiddle演示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接