0

我有一个数据集,在执行 order by 之后,我得到了这个:

 +------+
 |Emp_ID|
 +------+
 | E1   |
 | E10  |
 | E3   |
 | E4   |
 | E5   |
 +------+

我正在执行以下查询:

select emp_id from employee_master_table order by emp_id

为什么E10而不是E3追随E1

4

3 回答 3

4

因为您正在对字符串而不是数字进行排序。如果你有emp_idas EXXXwhere xare numbers 的标准格式,那么你可以替换E并将cast剩余的转换为 int。

SELECT *
FROM   employee_master
ORDER  BY CAST(REPLACE(emp_id, 'E', '') AS UNSIGNED)

输出

╔════════╗
║ EMP_ID ║
╠════════╣
║ E1     ║
║ E3     ║
║ E4     ║
║ E5     ║
║ E10    ║
╚════════╝
于 2013-05-16T05:44:39.417 回答
3

当您有一个基于字符的列时,排序是 LEXICAL,而不是 NUMERICAL。您需要前缀 E 有什么原因吗?如果不是,我建议在输出脚本中添加 E,并将其更改为 INT 字段,删除任何非数字字符

于 2013-05-16T05:43:39.740 回答
2

或者,您可以使用LENGTH()inORDER BY子句:

SELECT emp_id 
FROM employee_master_table 
ORDER BY length(emp_id), emp_id;

输出:

╔════════╗
║ EMP_ID ║
╠════════╣
║ E1     ║
║ E3     ║
║ E4     ║
║ E5     ║
║ E10    ║
╚════════╝

看到这个 SQLFiddle

具有更多值的 SQLFiddle

于 2013-05-16T05:50:06.403 回答