2010-11-27 2 views
1

Почему не работает следующий запрос? Mysql жалуется на z - не могу ли я использовать псевдоним в предложении WHERE?Фильтрация на псевдонимах в mysql

SELECT x + y AS z, t.* FROM t 
WHERE 
x = 1 and 
z = 2 

ошибка, что я получаю:

Error Code : 1054 
Unknown column 'z' in 'where clause' 
+0

Что говоря ошибку? – ajreal 2010-11-27 09:15:26

ответ

7

http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

Стандарт SQL запрещает ссылки на псевдонимами столбцов в ИНЕКЕ. Это ограничение наложено потому, что когда оценивается предложение WHERE, значение столбца , возможно, еще не было определено . Например, следующий запрос является незаконным:

SELECT id, COUNT(*) AS cnt FROM tbl_name WHERE cnt > 0 GROUP BY id; 

Попробуйте это вместо:

SELECT x + y AS z, t.* FROM t WHERE x = 1 HAVING z = 2; 
+0

ОК, спасибо. Но кто это работает? См. Http://stackoverflow.com/questions/4291031/what-is-the-semantic-difference-between-where-and-having – ripper234 2010-11-27 09:52:29

0

Использование имеющие пункт:

SELECT (x + y) AS z, t.* FROM t 
WHERE 
x = 1 
having z=2 
3

Вы должны знать, что использование предложение HAVING без предложение GROUP BY является нестандартным расширением MySQL и не будет работать в других базах данных.

Если вы хотите, чтобы быть портативными, вы должны использовать производную таблицу:

 
SELECT * 
FROM (
    SELECT (x + y) AS z, t.* 
    FROM t 
    WHERE x = 1 
) t2 
WHERE z = 2