Псевдонимы не работают в предложении ORDER BY

Это будет хорошо работать в 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;

Чтобы обеспечить совместимость, я всегда должен использовать второй способ?

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 во внутренней производной таблице вы не можете получить к ней доступ на внешнем уровне.

Так как foobar это псевдоним. это не столбец, если он не из производного запроса (подзапроса). Как это показано ниже

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

Согласно другим ответам, вы не можете использовать псевдоним в 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;
Другие вопросы по тегам