按 ORDER BY 排序时,数字应排在字母后面。

3

大家好,我想在MySQL中进行排序,按照以下顺序:

  • 特殊字符
  • 字母
  • 然后是数字

但似乎MySQL的排序方式为:

  • 特殊字符
  • 数字
  • 然后是字母

请参见下面的示例:

select distinct uag_linecode from part order by uag_linecode;

| A-1          |
| A/C          |
| A1S          |  out of place
| ABP          |
| ABS          |
| ACI          |
| ADM          |
| ADR          |
| BAS          |

This is what i want:

A-1 
A/C
ABR
ABS
ACI
ADM
ADR 
A1S correct spot
BAS

如果有人可以帮助我,我将感激不尽。

所有的行代码始终为3个字符长度。


代码总是三个字符长吗? - Sparky
排序是基于字符编码的,那些特殊字符的编码比数字和字母小。 - Daniel Cheng
这就是ASCII等等,数字排在表格的前面 - 你将需要一个自定义排序函数。 - Orbling
是的,它们始终是3个字符长。 - user1863457
UDF用于排序的示例问题:https://dev59.com/LmDVa4cB1Zd3GeqPepTK 当然,如果没有足够的服务器访问权限,UDF对人们可能没有任何用处。 - Orbling
1个回答

5

如果它始终是第二个字符,类似这样的东西就可以工作——您可以添加到case子句以检查第一个和第三个字符...

select distinct uag_linecode,
substring(uag_linecode, 2, 1)
from part
order by 
  case 
    when substring(uag_linecode, 2, 1) REGEXP ('^[0-9]') THEN 1 ELSE 0 END , uag_linecode

这里是SQL Fiddle

--编辑 似乎对于第一个和第三个字符也有效:

select distinct uag_linecode,
   substring(uag_linecode, 1, 1),
   substring(uag_linecode, 2, 1),
   substring(uag_linecode, 3, 1)
from part
order by 
   case when substring(uag_linecode, 1, 1) REGEXP ('^[0-9]') THEN 1 ELSE 0 END,
   substring(uag_linecode, 1, 1),
   case when substring(uag_linecode, 2, 1) REGEXP ('^[0-9]') THEN 1 ELSE 0 END,
   substring(uag_linecode, 2, 1),
   case when substring(uag_linecode, 3, 1) REGEXP ('^[0-9]') THEN 1 ELSE 0 END ,    
   substring(uag_linecode, 3, 1)

还有更多的例子

正如@Orbling所说,如果你有很多记录,删除REDEXP并使用>='0'AND<='9'将获得更好的性能。

祝好运。


这个问题在于,如果你访问http://sqlfiddle.com/#!2/a8b91/1,当你添加一个BBA的行代码时,它会把A1S放在BBA下面,但它仍然需要按字母顺序排列。 - user1863457
不错的答案,尽管我想它会非常慢。可以使用 ... >= '0' && ... <= '9' 来替换缓慢的 REGEXP 操作。 - Orbling
@user1863457 -- 你看到我的修改了吗?应该可以用这个工作吧?http://sqlfiddle.com/#!2/a8b91/2 - sgeddes
我刚刚在顶部进行了编辑以验证我的意思,尽管我非常感谢你的帮助,但你所做的并不起作用。 - user1863457
http://sqlfiddle.com/#!2/71100/1 如果你在开头添加另一个字母,它仍然需要按照A##,B##,C##等顺序进行。 - user1863457
需要在ORDER BY中添加更多的条件:http://sqlfiddle.com/#!2/71100/3 -- 我会编辑我的回答 -- 发现得好。 - sgeddes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接