【问题标题】:Sort numbers After letters in ORDER BY按 ORDER BY 对字母后的数字进行排序
【发布时间】:2013-01-30 01:39:20
【问题描述】:

您好,我正在尝试通过排序在 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 个字符长。

【问题讨论】:

  • 代码总是3个字符吗?
  • 按字符码排序,特殊字符的码值小于数字和字母。
  • 这对你来说是 ASCII 等,数字在表中的第一位 - 你需要一个自定义排序函数。
  • 是的,它们总是 3 个字符长
  • 关于 UDF 排序的示例问题:stackoverflow.com/questions/9339338/… 当然,UDF 不一定对没有足够访问服务器权限的人有用。

标签: mysql sql database sql-order-by


【解决方案1】:

如果它始终是第二个字符,这样的事情会起作用——你可以添加到 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)

还有更多Fiddle

正如@Orbling 正确所说,删除 REDEXP 并使用 >= '0' AND

祝你好运。

【讨论】:

  • 这个问题是如果sqlfiddle.com/#!2/a8b91/1 看看如果你添加了 BBA 的行代码,它会将 A1S 放在 BBA 下面,它仍然需要按字母顺序排列。
  • 很好的答案,虽然我想它会运行得很慢。可以只使用... >= '0' && ... <= '9' 删除慢速REGEXP 操作。
  • @user1863457 -- 你看到我的编辑了吗?应该和那个一起工作吗? sqlfiddle.com/#!2/a8b91/2
  • 我刚刚在顶部也做了一个编辑,以验证我的意思你所做的事情不会奏效,尽管我非常感谢你的帮助
  • sqlfiddle.com/#!2/71100/1 如果你在开头添加另一个字母,它仍然需要去 A## 然后 B##、C## 等
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多