mysql数据是如何排列数字后的第一个字母的

dm7nw8vv  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(310)

我有如下的数据表,我试着按许多选项排序,但总是有人认为是错误的。我的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

你怎么看“类型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个字母,但总是字母和数字之间的一个空格

vh0rcniy

vh0rcniy1#

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

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

编辑:我应该指出的是,我之所以不建议简单地按长度排序,是因为op说的是长度 type 列值是可变的(3或4个字符)。
如果您的数字前面有完全相同的前缀(例如,如果总是“type####“),通常会建议使用这种方法:

order by char_length(type), type
sbtkgmzw

sbtkgmzw2#

基础列是一个字符串,如果要进行字符串排序,则需要转换为数字。

CONVERT(type, UNSIGNED INTEGER)

会把它转换成一个数字。

0ve6wy6x

0ve6wy6x3#

根据下面的样本数据将使用 substring 以及 POSITION ```
select * from types
order by CONVERT( substring(type, POSITION(' ' IN type)),UNSIGNED INTEGER) asc

另一种方法是使用 `SUBSTRING_INDEX` ```
select * from types 
order by CONVERT(SUBSTRING_INDEX(type,' ',-1),UNSIGNED INTEGER) asc

http://www.sqlfiddle.com/#!9/314d43/1月
http://www.sqlfiddle.com/#!9月314日43月3日

相关问题