【问题标题】:MySQL order by (str to int)MySQL order by (string to int)
【发布时间】:2018-09-02 12:27:12
【问题描述】:
SELECT `01` FROM perf WHERE year = '2013' order by CAST(`01` AS INT) LIMIT 3

第 01 列的数值为 varchar。我需要将“01”的前 3 位订购为整数。为什么这个查询不起作用?

这样的表;

+----------------------+
| name | 01 | 02 | year|
+----------------------+
|name1 | 90 |*** |2013 |
+----------------------+
|name2 | 93 | 55 |2013 |
+----------------------+
|name3 |*** | 78 |2013 |
+----------------------+

查询应按 01 排序(忽略 *)并给出名称和值。

【问题讨论】:

  • 你能提供样本记录和想要的结果吗?
  • 这将给出列的最低三个值。你想要ORDER BY ... DESC 吗?
  • 按 ... desc 排序,是的。此查询给出 SQL 语法错误。

标签: mysql sql-order-by


【解决方案1】:

MySQL 不允许您使用CAST('01' AS INT)。它需要 SIGNEDUNSIGNED

SELECT `01` FROM perf WHERE year = '2013' order by CAST(`01` AS SIGNED) LIMIT 3

查看MySQL docs on CAST() 了解完整详情。

mysql> SELECT CAST('01' AS SIGNED);
+----------------------+
| CAST('01' AS SIGNED) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

要强制将非数字字符串排在最后,您需要在ORDER BY 中应用CASE,这会为它们分配一个高得离谱的值。条件应该测试01 中的值不等于0and 当转换为SIGNED 时,结果不是0,因为非数字字符串将强制转换为零。

如果不满足这些条件,则假定字符串为非数字,并在ORDER BY 中给出值 999999999,这会将它们推到末尾。它们随后由name 订购。

SELECT * FROM perf 
WHERE year = '2013'
ORDER BY
  CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE 999999999 END,
  name
LIMIT 3

http://sqlfiddle.com/#!2/846e2/6

要使这些排序降序,请使用低得离谱的值(负)而不是高值

  CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE -999999999 END DESC,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2017-04-08
    • 2015-02-26
    • 2013-01-24
    相关资源
    最近更新 更多