0

这将在 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;

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

4

3 回答 3

3

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

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

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

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

于 2012-11-05T11:30:55.807 回答
1

因为foobar是别名。它不是列,除非它来自派生查询(子查询)。如下面的这个

SELECT * 
FROM
(
   SELECT INSTR(foo, 'Bar') as foobar
   FROM Table
) a
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC;
于 2012-11-05T11:28:38.817 回答
1

根据其他答案,您不能在CASE. 您可以像这样直接使用,
而不是使用子查询:INSTR()CASE

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

当您使用子查询时,请注意您还必须选择要按它排序的列,否则您将收到这样foo的错误

所以你的子查询查询应该是:

SELECT * FROM
(
    SELECT foo,INSTR(foo, 'Bar') as foobar
    FROM t
) A
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC;
于 2012-11-05T11:34:53.820 回答