在mysql中以数字方式对varchar字段进行排序

Vij*_*raj 2 mysql

我有一个varchar名为_tid的字段,通常包含数字字段,但也可能包含字符串字段。现在我想按数字而不是按字典顺序对列进行排序。这里我使用的查询,

mysql> select _tid,_name from teacher order by _tid;
Run Code Online (Sandbox Code Playgroud)

它返回以下行集。

 +------+----------------------+
    | _tid | _name                |
    +------+----------------------+
    | 1    | A.MANIVANNAN         |
    | 10   | M.ELUMALAI           |
    | 100  | SAMPATH.R            |
    | 101  | S.PAULRAJ            |
    | 102  | A.ASHOK KUMAR        |
    | 103  | S.JAYAKUMAR          |
    | 104  | S.CINRAS             |
    | 105  | P.MURUGAN            |
    | 106  | S.VIJAY              |
    | 107  | N.KARTHIKEYAN        |
    | 108  | G.BALAKRISHNAN       |
    | 109  | C.THARANI            |
    | 11   | M.PONNUSAMY          |
    | 110  | J.KANNAN             |
    | 111  | V.MAHENDRAN          |
Run Code Online (Sandbox Code Playgroud)

但我想要如下设置的行,

+------+----------------------+
| _tid | _name                |
+------+----------------------+
| 1    | A.MANIVANNAN         |
| 2    | A.PONNIVALAVAN       |
| 3    | B.MUTHU              |
| 6    | R.Kumar              |
| 4    | P.RAJAKALI           |
| 5    | N.Shaunmuga Sundram  |
| 8    | M.Balaji             |
| 7    | V.PALANI             |
| 9    | J.RANJITH            |
| 10   | M.ELUMALAI           |
| 11   | M.PONNUSAMY          |
Run Code Online (Sandbox Code Playgroud)

dez*_*zso 5

两种可能性:要么用左边的零填充你的值,然后根据它排序:

SELECT _tid, _name FROM teacher ORDER BY lpad(_tid, 3, '0');
-- choose an appropriate number instead of 3
Run Code Online (Sandbox Code Playgroud)

或者将您的值转换为一个数字(类似于 Aaron W 的解决方案,除了这里我明确转换,这是一个更清晰的解决方案):

SELECT _tid,_name FROM teacher ORDER BY cast(_tid as decimal);
Run Code Online (Sandbox Code Playgroud)

如果您的字段中有非数字字符串,请小心:

SELECT cast('something' as decimal);
0
SELECT 'something' + 0;
0
Run Code Online (Sandbox Code Playgroud)