允许您在 SELECT 语句中引用别名列的 PostgreSQL 函数是啥?
Posted
技术标签:
【中文标题】允许您在 SELECT 语句中引用别名列的 PostgreSQL 函数是啥?【英文标题】:What is the PostgreSQL function called that allows you to reference aliased columns in SELECT statement?允许您在 SELECT 语句中引用别名列的 PostgreSQL 函数是什么? 【发布时间】:2018-05-18 21:23:26 【问题描述】:我的公司正在从 Netezza 过渡到 AWS/Redshift。使用 Netezza 时,可以方便地在 select 语句中命名列,然后可以再次引用它,例如:
Select Column1 + Column2 as Alias1, Alias1 + Column3 as Alias2 from X where Alias1 > 0
Netezza 允许我这样做,但我不能在 Redshift 中这样做。 (我也不能在 MS SQL 中这样做)。我无法在 SELECT 语句中引用列别名,也无法在 WHERE 子句中引用它。
这个功能的名称是什么,有没有办法实现它?没有这个功能,我不得不繁琐地编写子查询。
谢谢
【问题讨论】:
你在使用任何类型的 ORM 吗?这可以很容易地在 ORM 中实现 【参考方案1】:你不能这样做,但你可以编写类似于子查询但按逻辑顺序排列的 CTE:
WITH
q1 as (
select Column1 + Column2 as Alias1, Column3
from x
)
select *, Alias1 + Column3 as Alias2
from q1
where Alias1>0
【讨论】:
【参考方案2】:你不能这样做,但为什么不这样做有一个非常具体和合乎逻辑的原因。
SQL 查询的逻辑处理涉及的阶段如下按特定顺序:
FROM clause
WHERE clause
GROUP BY clause
HAVING clause
SELECT clause
DISTINCT clause
ORDER BY clause
LIMIT / OFFSET clause
所以当您的查询到达select
时,其他一切都已完成。 where
部分位于 select
部分之前,因此无法看到您设置的列别名。
您可以从link 了解更多信息。
【讨论】:
“不能”这个词太夸张了。事实上,你可以在 netezza 上。具有列别名的计算列可用于 where 子句、group by 以及 order by,但更令人惊讶的是,在 select 语句中更靠右的其他计算列中。如果您不了解相关数据库,请不要“解释”这些事情。 他专门询问如何在 PostgreSQL 中执行此操作,这就是我要回答的问题。 Netezza(以及其他数十个 wiki.postgresql.org/wiki/PostgreSQL_derived_databases)已经扩展并在它之上构建的事实很酷,但这不是问题。以上是关于允许您在 SELECT 语句中引用别名列的 PostgreSQL 函数是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 FROM 子句中引用别名为表的其他 SQL SELECT 语句
SELECT 语句中的列别名不适用于 SQuirrel SQL + Firebird
如何在 MariaDB/MySQL 工作台中获取 SELECT 语句的输出,以“table.column”格式命名列,而不仅仅是“column”?