Псевдонимы не работают в предложении 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;