繁体   English   中英

为什么在Oracle和Mysql中不支持在同一选择中使用列别名?

[英]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 BYORDER BYHAVING子句中使用别名来引用该列:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM