SQL 按大小写排序
SQL Order By with case when
我试图通过 CASE WHEN.
理解 ORDER BY
我的目标是从根本上理解它,因为我创建了不同的用例
我的基础table如下
| Name |
|--------|
| BPM |
| BXR |
| Others |
| XZA |
| XYZ |
| PQR |
| ABC |
查询 1:基本 ORDER BY
SELECT *
FROM City
ORDER BY Name
查询 1 Result:Gave 正确输出如下(名称列按升序排序)
| 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 结果:我得到部分正确 result.I 最后得到 Others
但其他 names
我预计它会在升序 order.They 实际出现的方式在基地 table.
| 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 结果:我部分正确 result.I 最后得到 'Others' 和 'BXR' 但其他 Name
不是按字母顺序排列的 order.Same在查询 2.Here 中我也不理解 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
的假设是,它们只是决定 "order" 记录所在位置的数字。
(首先保留记录为 0 的记录,如果所有其他记录都有 1 则应按字母顺序排序)
(如果有'0','1','2',在0
的记录中应该是第一个,1
的记录应该是第二个所有其他具有2
的记录应该被排序按字母顺序)
如有错误请指正
您还需要按顺序添加名称
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
我们也可以 ORDER BY
使用 FIELD
:
SELECT *
FROM City
ORDER BY FIELD(Name, 'Others', 'PQR') DESC, name;
FIELD
的行为是 return 1 表示 Others
,2 表示 PQR
,0 表示任何其他名称。因此,我们使用降序来确保 PQR
首先出现,然后是 Others
,然后是所有其他名称。
您可以将 else
案例中的 name
列保留为:
SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'PQR' THEN 0
WHEN Name = 'Others' THEN 1
ELSE Name
END
因为数字总是优先于字母。
我试图通过 CASE WHEN.
理解 ORDER BY我的目标是从根本上理解它,因为我创建了不同的用例
我的基础table如下
| Name |
|--------|
| BPM |
| BXR |
| Others |
| XZA |
| XYZ |
| PQR |
| ABC |
查询 1:基本 ORDER BY
SELECT *
FROM City
ORDER BY Name
查询 1 Result:Gave 正确输出如下(名称列按升序排序)
| 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 结果:我得到部分正确 result.I 最后得到 Others
但其他 names
我预计它会在升序 order.They 实际出现的方式在基地 table.
| 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 结果:我部分正确 result.I 最后得到 'Others' 和 'BXR' 但其他 Name
不是按字母顺序排列的 order.Same在查询 2.Here 中我也不理解 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
的假设是,它们只是决定 "order" 记录所在位置的数字。
(首先保留记录为 0 的记录,如果所有其他记录都有 1 则应按字母顺序排序)
(如果有'0','1','2',在0
的记录中应该是第一个,1
的记录应该是第二个所有其他具有2
的记录应该被排序按字母顺序)
如有错误请指正
您还需要按顺序添加名称
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
我们也可以 ORDER BY
使用 FIELD
:
SELECT *
FROM City
ORDER BY FIELD(Name, 'Others', 'PQR') DESC, name;
FIELD
的行为是 return 1 表示 Others
,2 表示 PQR
,0 表示任何其他名称。因此,我们使用降序来确保 PQR
首先出现,然后是 Others
,然后是所有其他名称。
您可以将 else
案例中的 name
列保留为:
SELECT *
FROM City
ORDER BY CASE
WHEN Name = 'PQR' THEN 0
WHEN Name = 'Others' THEN 1
ELSE Name
END
因为数字总是优先于字母。