【问题标题】:Order by numeric values in SQL ascending在 SQL 升序中按数值排序
【发布时间】:2012-12-04 04:10:47
【问题描述】:

我正在尝试获取此输出。

MDT 1
MDT 2
MDT 3
MDT 11
MDT 44

但是,这些值是按字母顺序排列的,所以 123 在 2 之前。

示例:

MDT 1
MDT 11
MDT 156
MDT 2
MDT 3
MDT 303
MDT 44

等等。

我正在使用此代码,但它似乎不起作用。

SELECT * FROM file ORDER BY ABS(ID) ASC

我该如何解决这个问题?

【问题讨论】:

标签: php mysql sql-order-by


【解决方案1】:

如果您的 ID 总是包含前缀 MDT,那么您可以使用它来根据您的要求进行排序:

SELECT * FROM File 
ORDER BY CAST(replace(ID, 'MDT ', '') AS UNSIGNED) ASC

SQLFiddle demo

【讨论】:

  • +1 ..我认为 id 和 mdt 在不同的字段中..但它是相同的
  • MDT 作为 ID 的默认名称。它在同一个领域
  • 然后上面的查询将起作用,因为它删除了 MDT 并对剩余整数值进行排序,将其转换为整数。
  • 查看 SQL Fiddle 演示以了解它的作用。
【解决方案2】:

试试sn-p

SELECT * FROM file ORDER BY ID + 0 ASC

【讨论】:

  • 不好意思sn-p是把字符串转成int
【解决方案3】:

尝试这样它会根据数字排序:

select substr(id,4)*1 from file order by substr(id,4)*1

它会给你

1
2
3
11
44
...

如果您想要所有字段,请根据您的字符串长度(例如:id= proj- 001911 --> 取 SUBSTR(id, 6) *1) )

select * from file order by substr(id,4)*1

【讨论】:

    【解决方案4】:
    SELECT * FROM file
    ORDER BY CONVERT(SUBSTRING(ID,5),UNSIGNED) ASC
    

    SUBSTRING() 将提取'MDT ' 之后的所有字符,CONVERT() 会将剩余的子字符串更改为执行ORDER BY 的无符号整数

    注意SUBSTR()SUBSTRING()的同义词。

    【讨论】:

      【解决方案5】:

      我也在搜索它,但是就在阅读这里时,我突然想到了一个解决方案,如果该列只有数字作为数据,那么您需要在数据库表中进行修改并定义该列作为 INT 值类型,那么我相信你需要的东西都会完成。 例如。 {SELECT * FROM file ORDER BY CONVERT(SUBSTRING(ID,5),UNSIGNED) ASC} 在这种情况下 Convert 是列,需要定义为 INT(5) 才能工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多