mysql数据如何在数字后第一个字母排序

时间:2018-07-27 17:49:19

标签: mysql

我的数据表如下所示,我尝试通过许多选项进行订购,但总有些错误。我的SQL结果:

select type from types
order by type ASN;

TYPE 1
TYPE 10
TYPE 11
TYPE 12
TYPE 13
TYPE 14
TYPE 15
TYPE 16
TYPE 17
TYPE 18
TYPE 19
TYPE 2
TYPE 20
TYPE 21

您如何看待“ TYPE 2”在19类型下,我希望得到如下结果

TYPE 1
TYPE 2
TYPE 10
TYPE 11
TYPE 12
TYPE 13
TYPE 14
TYPE 15
TYPE 16
TYPE 17
TYPE 18
TYPE 19
TYPE 20
TYPE 21

我表中的数据具有不同的类型,并不总是4个字母,有时却是3个字母,但字母和数字之间总是一个空格

3 个答案:

答案 0 :(得分:2)

如果只有一个单词后跟一个数字的数据,则可以使用substring_index在空格处分割字符串。然后,您可以按这两个不同的值排序。请注意,您需要将数字转换为整数,以便MySQL以数字方式而不是字母数字方式对其进行排序。

select 
  *
from types
order by
  substring_index(type, " ", 1),
  convert(substring_index(type, " ", -1), signed int)

编辑:我应该指出,我之所以不建议简单地按长度来执行典型的顺序,是因为OP表示type列值的长度是可变的(3或4字符)。

如果您在数字前使用完全相同的前缀(例如,如果它始终是“类型###”),通常会建议使用以下方法:

order by char_length(type), type

答案 1 :(得分:0)

基础列是一个字符串,您正在进行字符串排序,需要转换为数字。

CONVERT(type, UNSIGNED INTEGER)

将其转换为数字。

答案 2 :(得分:0)

根据下面的示例数据,可以使用void function(struct hexColour *hc) { // ... } int main(void) { // ... function(&hc); // ... } substring

POSITION

使用 select * from types order by CONVERT( substring(type, POSITION(' ' IN type)),UNSIGNED INTEGER) asc

的另一种方法
SUBSTRING_INDEX

http://www.sqlfiddle.com/#!9/314d43/1

http://www.sqlfiddle.com/#!9/314d43/3