[英]Why use of column alias in same select is not supported in Oracle and Mysql?
create table t1 (c1 integer);
select c1*3 temp, case when (temp <>3) then 1 else 0 end from t1;
在Oracle和MySQL中查询均失败,但是为什么它们不支持这种查询呢?
我已经经历了与列别名相关的答案。 它在任何地方都在where子句中说明了支持什么,不支持什么以及原因。 但是问题是为什么select子句中不支持它。
可以在查询选择列表中使用别名来为列指定其他名称。 您可以在GROUP BY
, ORDER BY
或HAVING
子句中使用别名来引用该列:
SELECT SQRT(a*b) AS root FROM tbl_name
GROUP BY root HAVING root > 0;
SELECT id, COUNT(*) AS cnt FROM tbl_name
GROUP BY id HAVING cnt > 0;
SELECT id AS 'Customer identity' FROM tbl_name;
标准SQL不允许在WHERE
子句中引用列别名。 之所以施加此限制,是因为在评估WHERE
子句时,可能尚未确定列值。 例如,以下查询是非法的:
SELECT id, COUNT(*) AS cnt FROM tbl_name
WHERE cnt > 0 GROUP BY id;
WHERE
子句确定应在GROUP BY
子句中包括哪些行,但它引用的是列值的别名,该别名直到选择了行并由GROUP BY
分组后才知道。
在查询的选择列表中,可以使用标识符或字符串引号指定带引号的列别名:
SELECT 1 AS `one`, 2 AS 'two';
在语句的其他地方,带引号的别名引用必须使用标识符引号,否则该引用将被视为字符串文字。 例如,该语句将列ID中的值分组,并使用别名a
引用:
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
GROUP BY `a`;
但是此语句按文字字符串“ a”分组,将无法按预期工作:
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
GROUP BY 'a';
资料来源: https : //docs.oracle.com/cd/E17952_01/refman-5.0-zh/problems-with-alias.html
除ORDER BY
(在Oracle中)外,您不能在任何节中使用别名
因此,您可以执行以下任一操作:
select c1*3 temp, case when (c1*3 <>3) then 1 else 0 end from t1;
要么:
select temp, case when (temp <>3) then 1 else 0 end
from (
select c1*3 temp from t1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.