我有一个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)
两种可能性:要么用左边的零填充你的值,然后根据它排序:
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)