【问题标题】:How to Order MySQL VARCHAR Results如何订购 MySQL VARCHAR 结果
【发布时间】:2011-02-20 03:27:02
【问题描述】:

在 SELECT 语句中,我有一个带有 ORDER BY DESC 的 varchar 列。本栏目数据示例:

1234
987
12-a
13-bh

MySQL 会返回类似于以下内容的选择:

987
12-a
1234
13-bh

它将三个字符长的结果放在四个字符长的结果之前,依此类推。我希望它忽略长度,只对“-”字符之前的数字进行排序。有没有我可以在 IF() 中像 SUBSTRING 一样订购的东西,它会删除以“-”字符开头的一行中的所有数据,以便我可以将其转换为整数?

【问题讨论】:

  • ... ORDER BY CAST(SUBSTR(yourfield, 0, LOCATE('-', yourfield)) AS INTEGER) 将是一个很好的起点。如果字段中没有“-”,它将失败,因为您将执行 0 长度的子字符串。

标签: mysql sql-order-by


【解决方案1】:

最简单的就是这个

SELECT *
FROM TBL
ORDER BY VARCHAR_COLUMN * 1;

要查看发生了什么,只需添加我用于订购的列

SELECT *, VARCHAR_COLUMN * 1
FROM TBL
ORDER BY VARCHAR_COLUMN * 1;

【讨论】:

  • 这比我刚刚想出的要优雅得多,它也有效: ORDER BY IF(LOCATE('-', columnName) != 0, CAST(SUBSTRING(columnName, 1,LOCATE ('-', columnName) - 1) AS DECIMAL), CAST(columnName AS DECIMAL)) DESC
  • +1 我喜欢这样的解决方案! (假设它始终如一地工作。)
【解决方案2】:

技巧部分是处理“-”:因为它是可选的,所以你不能直接在该字段中使用 SUBSTR(正如 Marc B 指出的那样)来摆脱它之后的所有内容

因此,诀窍是:将“-”附加到值!

像这样:

ORDER BY CAST(SUBSTR(CONCAT(yourfield,'-'), 0, LOCATE('-', CONCAT(yourfield,'-'))) AS UNSIGNED)

另一个有用的方法是,而不是使用 SUBSTR 来“删除”“-”之后的所有内容,而是将其(和所有字母)替换为“0”,然后使用 CAST。

【讨论】:

  • 不要介意我对 REPLACE 方法的建议:因为 MySQL 不支持替换正则表达式(仅用于搜索),所以它不是一个好方法。使用我提出的“CONCAT -> SUBSTR -> CAST AS NUMERIC”解决方案。
  • 您不能转换为整数。它必须强制转换为 UNSIGNED。还是看我的回答
  • 你说得对......在 MySQL 中是 UNSIGNED,而不是 INTEGER。我总是搞乱 Oracle/MS SQL/MySQL 数据类型。在 MySQL 中,INTEGER 不是“真正的”数据类型,它只是一个别名,因此您不能“CAST”它。但无论如何......你的解决方案是时尚!它有效吗?我不知道 MySQL 用这个“隐式转换”做了什么
  • @richard :+1 为您的回答...不能比这更容易和更时尚了!好电话!
【解决方案3】:
...
....
CAST(COL as SIGNED)  DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多