簡體   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