在ORDER BY中的字母后排序数字

时间:2013-01-29 16:53:37

标签: mysql sql database sql-order-by

你好我试图通过排序

在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          |

这就是我想要的:

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

如果有人能帮助我,我会永远感激。

所有行代码总是3个字符。

1 个答案:

答案 0 :(得分: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

- 编辑 这似乎也适用于第1和第3个字符:

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)

更多Fiddle

同样正如@Orbling所说,你将获得更好的表现(特别是如果你有很多记录)来删除REDEXP并使用> ='0'AND< ='9'。

祝你好运。