mysql - 当要排序的列是 case 语句时,如何通过 BigInteger 而不是 varchar 使 MySQL 排序值?

标签 mysql sql sql-order-by

我有一个 SQL 查询:

SELECT column_1, column_2, column_3 
FROM table_1 join table_2 .... 
ORDER BY
CASE :expression
WHEN 'Column_1' then column_1
WHEN 'Column_2' then column_2
WHEN 'Column_3' then column_3
END asc;

我在我的 Java 代码中使用它,用 native 查询调用它。 该表是这样定义的:

column_1 BIGINT(20)
column_2 VARCHAR(20)
column_3 INT(11)

第 1 列包含从 1 到 9999 的值。当我尝试按第 1 列对该查询进行排序时,我的结果像文本一样排序。例如:

预期结果:

|column_1|
_________
98
99
100
101
...

实际结果:

|column_1|
_________
100
101
98
99
...

你们中有人知道如何使用我所说的语法使 MySQL 按 column_1 排序并使其工作吗?我尝试过转换、转换、加 0 和乘以 1,但都无济于事。当我删除其中包含 VARCHAR 列的案例时,查询将完美运行。不幸的是,当它们存在时,就会发生这种情况。有人吗?

最佳答案

将其分成单独的 case 表达式:

ORDER BY (CASE WHEN :expression = 'Column_1' THEN column_1 END),
         (CASE WHEN :expression = 'Column_2' THEN 'column_2' END),
         (CASE WHEN :expression = 'Column_3' THEN 'Column_3' END)

您遇到的问题是由类型转换引起的。 case 表达式返回单个值。如果 THEN 值之一是字符串,则类型转换规则会将 所有 转换为字符串——这就是您遇到的问题。

关于mysql - 当要排序的列是 case 语句时,如何通过 BigInteger 而不是 varchar 使 MySQL 排序值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41100268/

相关文章:

vb.net - 在循环中添加多个 OrderBy 语句的 Linq 查询

mysql - 重新排序 MYSQL 表

mysql - sql 连接表,其中 1 列有逗号

php - 标记为崩溃的 mysql 表

sql - 传递依赖有什么问题?

java - Java程序中的数据库使用

sql - DELETE FROM 查询上的多个 IN 条件引发 #245 转换类型错误

php - MySQL 错误 : You have an error in your SQL syntax (ENGINE=MyISAM)

mysql - 如何在 SQLAlchemy 中删除多对一关系中的子项?

ruby-on-rails - 使用 Rails 3.0 + Postgres 的复杂排序查询