我有一个数据集,在执行 order by 之后,我得到了这个:
+------+
|Emp_ID|
+------+
| E1 |
| E10 |
| E3 |
| E4 |
| E5 |
+------+
我正在执行以下查询:
select emp_id from employee_master_table order by emp_id
为什么E10
而不是E3
追随E1
?
因为您正在对字符串而不是数字进行排序。如果你有emp_id
as EXXX
where x
are numbers 的标准格式,那么你可以替换E
并将cast
剩余的转换为 int。
SELECT *
FROM employee_master
ORDER BY CAST(REPLACE(emp_id, 'E', '') AS UNSIGNED)
输出
╔════════╗
║ EMP_ID ║
╠════════╣
║ E1 ║
║ E3 ║
║ E4 ║
║ E5 ║
║ E10 ║
╚════════╝
当您有一个基于字符的列时,排序是 LEXICAL,而不是 NUMERICAL。您需要前缀 E 有什么原因吗?如果不是,我建议在输出脚本中添加 E,并将其更改为 INT 字段,删除任何非数字字符
或者,您可以使用LENGTH()
inORDER BY
子句:
SELECT emp_id
FROM employee_master_table
ORDER BY length(emp_id), emp_id;
输出:
╔════════╗
║ EMP_ID ║
╠════════╣
║ E1 ║
║ E3 ║
║ E4 ║
║ E5 ║
║ E10 ║
╚════════╝