【发布时间】:2019-12-14 11:06:51
【问题描述】:
基于
Amazon Redshift announces support for lateral column alias reference:
对横向列别名引用的支持使您能够编写查询而无需在 SELECT 列表中重复相同的表达式。例如,您可以定义别名“概率”并在同一个选择语句中使用它:
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
基本相同:
select 1 AS col
,col + 1 AS col2;
大多数 SQL RDBMS 将返回错误:Unknown column 'col' in 'field list'
它看起来像一个有趣的语言扩展,但有一个警告。如果我有一个不确定的函数怎么办:
select RAND() AS col
,col + 1 AS col2
-- if RAND() returns 0.5 then I would expect
-- 0.5 and 1.5
-- I get: 0.3 and 1.7
-- it means that the query was evaluated as:
select RAND() AS col,
RAND() + 1 AS col2
与来自 PostgreSQL 的 LATERAL JOIN 相比(是的,我知道这是不同的功能,我希望“横向库别名”的行为方式相同):
SELECT s.col, s.col+1 AS col2
FROM t ,LATERAL (SELECT RANDOM()) AS s(col)
-- 0.19089933477628307 1.190899334776283
但事实并非如此。我得到了两个独立的运行,如果它是简单的“内联”,这似乎是有效的:
别名在目标列表中定义后立即被识别。您可以在同一目标列表中定义的其他表达式中使用别名。以下示例说明了这一点。
横向别名引用的好处是在同一个目标列表中构建更复杂的表达式时,您不需要重复别名表达式。当 Amazon Redshift 解析这种类型的引用时,它只是内联先前定义的别名。如果 FROM 子句中定义的列与先前的别名表达式具有相同的名称,则 FROM 子句中的列优先。
当我们使用不确定或时间敏感的函数/引用/子查询时,我的理解是否正确并且此功能不“安全”?
【问题讨论】:
-
我对该文档的阅读是-正如您所见-
select RAND() AS col ,col + 1 AS col2被视为select RAND() AS col, RAND() + 1 AS col2或一般select (some expression) AS col, (some expression) + 1 AS col2
标签: sql amazon-redshift