【问题标题】:Order by last 2 characters string按最后 2 个字符串排序
【发布时间】:2013-12-12 10:16:38
【问题描述】:

这是我查询的结果,但它没有正确排序。我想按最后 2 个字符排序。结果应该是:Fa0/10 低于Fa0/9

Fa0/1
Fa0/10
Fa0/11
Fa0/12
Fa0/2
Fa0/3
Fa0/4
Fa0/5
Fa0/6
Fa0/7
Fa0/8
Fa0/9
Gi0/1
Gi0/2
Null0
Vlan1

我的查询:

SELECT inft.port FROM interfaces AS intf ORDER BY RIGHT(intf.port + 0, 2)

二:sqlfiddle

【问题讨论】:

  • 你必须分别获取数字部分和关于字符串和数字的顺序
  • 告诉我们您使用的 DBMS 以及未正确排序的值的可能性。
  • sql server、mysql、oracle?
  • @FilipeSilva 我正在使用 mysql 工作台和 mysql 服务器
  • 将两部分分开存放。

标签: mysql sql select sql-order-by


【解决方案1】:

试试这个:

SELECT port 
FROM interfaces 
ORDER BY SUBSTRING_INDEX(port, '/', 1), CAST(SUBSTRING_INDEX(port, '/', -1) AS SIGNED)

查看SQL FIDDLE DEMO

输出

|   PORT |
|--------|
|  Fa0/1 |
|  Fa0/2 |
|  Fa0/3 |
|  Fa0/4 |
|  Fa0/5 |
|  Fa0/6 |
|  Fa0/7 |
|  Fa0/8 |
|  Fa0/9 |
| Fa0/10 |
| Fa0/11 |
| Fa0/12 |
|  Gi0/1 |
|  Gi0/2 |
|  Null0 |
|  Vlan1 |

【讨论】:

  • @SaharshShah:确实解决了我的问题,但是你能解释一下实现的逻辑吗?请问?
【解决方案2】:

为什么需要+ 0 ??只需将其删除即可。

SELECT port FROM interfaces ORDER BY RIGHT(port, 2)

SQL Fiddle Demo

输出:

PORT
------------
Fa0/1
Gi0/1
Gi0/2
Fa0/2
Fa0/3
Fa0/4
Fa0/5
Fa0/6
Fa0/7
Fa0/8
Fa0/9
Fa0/10
Fa0/11
Fa0/12
Null0
Vlan1

【讨论】:

  • 我编辑了我的小提琴。如您所见,使用 mysql 的命令不同。感谢您的帮助。
【解决方案3】:

顺序正确 - 按字典顺序排列。

您需要将它们转换为数字。

【讨论】:

    【解决方案4】:

    更新

    提取最后两个字符后需要+ 0将其转换为数字

    SELECT inft.port FROM interfaces AS intf ORDER BY SUBSTRING(intf.port, LOCATE('/', intf.port)+1, LENGTH(intf.port)) + 0
    

    【讨论】:

    • 这不起作用,因为当值小于 10 时,斜杠将被带入 RIGHT 字符串。
    • 是的,它不起作用。正如布拉德利所说,您首先需要根据/ 进行子字符串化,然后加上0 将其转换为数字。
    猜你喜欢
    • 2015-10-14
    • 2016-10-07
    • 1970-01-01
    • 2019-01-18
    • 2015-09-27
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多