我正在尝试通过 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
处于升序。它们实际上是在基表中出现的方式。 / p>
| 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
,2
的重要性
| Name |
|--------|
| BPM |
| XZA |
| XYZ |
| PQR |
| ABC |
| BXR |
| Others |
查询4:我希望Others
和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
的记录中的'0','1','2'应该排在第一,带有1
的记录应该排在第二,所有其他带有2
的记录都应该进行排序按字母顺序)
如果我错了,请纠正我
答案 0 :(得分:4)
您还需要按以下顺序添加姓名
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 :(得分:2)
我们也可以使用ORDER BY
FIELD
:
SELECT *
FROM City
ORDER BY FIELD(Name, 'Others', 'PQR') DESC, name;
FIELD
的行为使得它将为Others
返回1,为PQR
返回2,并为其他任何名称返回0。因此,我们使用降序排列以确保首先出现PQR
,然后出现Others
,然后出现所有其他名称。
答案 2 :(得分:2)
在name
情况下,您可以将else
列保留为:
SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'PQR' THEN 0
WHEN Name = 'Others' THEN 1
ELSE Name
END
因为数字始终优先于字母。