也许这个查询看起来不太好,但它会按照你想要的顺序对行进行排序:
select
MR,
LName,
FName
from (
select
MR,
LName,
FName,
least(
case when locate('0', MR)>0 then locate('0', MR) else length(MR)+1 end,
case when locate('1', MR)>0 then locate('1', MR) else length(MR)+1 end,
case when locate('2', MR)>0 then locate('2', MR) else length(MR)+1 end,
case when locate('3', MR)>0 then locate('3', MR) else length(MR)+1 end,
case when locate('4', MR)>0 then locate('4', MR) else length(MR)+1 end,
case when locate('5', MR)>0 then locate('5', MR) else length(MR)+1 end,
case when locate('6', MR)>0 then locate('6', MR) else length(MR)+1 end,
case when locate('7', MR)>0 then locate('7', MR) else length(MR)+1 end,
case when locate('8', MR)>0 then locate('8', MR) else length(MR)+1 end,
case when locate('9', MR)>0 then locate('9', MR) else length(MR)+1 end) pos
from users
) users_pos
order by
left(MR, pos-1),
mid(MR, pos, length(MR)-pos+1)+0
在子查询 users_pos 我正在计算一个数字的第一个位置,然后我按left(MR, pos-1)
哪个是字符串的非数字开头排序,哪个是字符串mid(MR, pos, length(MR)-pos+1)+0
的数字部分,添加 0 将转换为数字并以数字形式排序(因此 20002 在 200011 之前)。
看到它在这里工作。