我有一个 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/