MySQL ORDER BY字母数字值,首先是所有整数,然后是所有alpha

时间:2014-06-12 18:09:56

标签: mysql

寻找解决此问题的方法,但尚无答案。

使用一列字母数字模型ID号以按特定顺序填充索引。根据他们产生的顺序进行两次不同的尝试:

ORDER BY Model_ID ASC
1278-8
211E
350-50
996
3800P
AP23
AP263
AP26M
JA042


ORDER BY CAST(Model_ID AS UNSIGNED), Model_ID
AP23
AP263
AP26M
JA042
211E
350-50
996
1278-8
3800P

但是,我需要对它进行排序,首先将所有整数起始数用尽:

211E
350-50
996
1278-8
3800P
AP23
AP263
AP26M
JA042

帮助?感谢

2 个答案:

答案 0 :(得分:0)

对于样本数据,这将获得所需的顺序:

ORDER BY Model_ID+0=0, Model_ID+0, Model_ID ASC

让我们解开一下。

表达式Model_ID+0通过向数字上下文添加零来计算数字上下文中的Model_ID。基本上,MySQL获取可以转换为数字的任何前导字符,并忽略其余部分。对于无法解释为数字的值,MySQL返回0.

第一个表达式检查数值是否为零,因此最后将对它们进行排序。 (对于布尔值TR,MySQL返回数值1,对于FALSE,返回0。)

第二个表达式获取按数字顺序排序的非零值。

注意:这些表达式"工作"样本数据;边缘情况是具有前导零作为数值的值,例如, ' 000ABC'将在所有其他"数字"之后进行排序。值。并且MySQL并不仅仅停留在整数部分,如果有点字符,则可以解释为小数点。

您可以通过将表达式包含在SELECT列表中来查看表达式的值(用于测试),例如

SELECT Model_ID+0=0, Model_ID+0, ...

答案 1 :(得分:0)

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table (model_id VARCHAR(20) NOT NULL PRIMARY KEY);

 INSERT INTO my_table VALUES
 ('1278-8'),
 ('211E'),
 ('350-50'),
 ('996'),
 ('3800P'),
 ('AP23'),
 ('AP263'),
 ('AP26M'),
 ('JA042');

 SELECT model_id FROM my_table ORDER BY model_id + 0 = 0,model_id + 0;
 +----------+
 | model_id |
 +----------+
 | 211E     |
 | 350-50   |
 | 996      |
 | 1278-8   |
 | 3800P    |
 | AP23     |
 | AP263    |
 | AP26M    |
 | JA042    |
 +----------+