这在 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
,则您可以不在外部级别访问它。
我是一名优秀的程序员,十分优秀!