SQL Order By带大小写的情况

时间:2018-10-23 13:15:56

标签: sql sql-order-by case-when

我正在尝试通过 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语句中1ORDER 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相同,这里我也不明白012的重要性

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

查询4:我希望OthersPQR位于顶部。

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的记录中的'0','1','2'应该排在第一,带有1的记录应该排在第二,所有其他带有2的记录都应该进行排序按字母顺序)

如果我错了,请纠正我

SQLFiddle

3 个答案:

答案 0 :(得分:4)

您还需要按以下顺序添加姓名

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

答案 1 :(得分:2)

我们也可以使用ORDER BY FIELD

SELECT * 
FROM City
ORDER BY FIELD(Name, 'Others', 'PQR') DESC, name;

enter image description here

Demo

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

因为数字始终优先于字母。

SQL Fiddle Demo