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/

相关文章:

mysql - MySQL触发器中的多个if语句

mysql - mySQL运行缓慢的查询-60秒

python - 使用sql或sqlite的Webiopi(Raspberry pi)

python - 如果没有被其他对象引用,如何删除对象

php - 在 MySQL 中转换日期

mysql - 我可以查询按两列排序吗?

android - 字符串包含引号时出现 SQL 异常(无法识别的标记)

sql - 排除 Material list 样式关系中的空值

mysql - 如果第一列是唯一的,是否会检查 ORDER BY 的第二列?

php - MySQL 按今天、过去、 future 排序