[英]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.