mysql - 别名在 ORDER BY 子句中不起作用

标签 mysql sql sql-order-by case

这在 MySQL 5 中可以正常工作:

SELECT INSTR(foo, 'Bar') as foobar
FROM Table
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC;

在 MySQL 4 中,我得到错误:

ERROR 1054 (42S22): Unknown column 'foobar' in 'order clause'

但是,如果我将子句更改为此,它将适用于两个版本:

SELECT INSTR(foo, 'Bar') as foobar
FROM Table
ORDER BY CASE WHEN INSTR(foo, 'Bar') = 1 THEN foo END DESC;

为了确保兼容性,我是否必须始终使用第二种方式?

最佳答案

基本上您不能在同一“查询级别”重复使用列别名。

如果您想编写兼容/可移植的 SQL 并且不想重复函数调用,那么通常的做法是将查询包装到派生表中。

select *
from (
  SELECT INSTR(foo, 'Bar') as foobar,
         foo
  FROM Table
) t
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC;

请注意,您需要在内部查询中包含要在“外部”查询中使用的任何列。如果您在内部派生表中省略列 foo,则您可以在外部级别访问它。

关于mysql - 别名在 ORDER BY 子句中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13231167/

相关文章:

mysql - 为什么 ORDER BY 不使用索引?

postgresql - 多列索引和 ORDER BY

Java MySQL 异常 - 找不到合适的驱动程序

php - Uncaught Error : Call to a member function

c# - ExecuteNonQuery 不会在插入时抛出异常

mysql - 不正确的 MySQL 语法?

SELECT 上的 MySQL 更新

mysql - 显示一个表中的条目数,对于 SQL 中两个表共享的键,同时还包括另一个表中没有位置的条目

sql - Qlik Sense,用总和计算不同值

oracle - 如何在oracle的字母数字列中使用order by