它没有意义,文字不是有效的列?
SELECT x, y FROM (select 1 as x) t, LATERAL CAST(2 AS FLOAT) AS y; -- fine
SELECT x, y FROM (select 1 as x) t, LATERAL 2.0 AS y; -- SYNNTAX ERROR!如果您使用CASE子句或x+1表达式或(x+1).似乎对任何非函数都有错误。
Pg指南,关于LATERAL expression (不是横向子查询),比如
当计算要连接的行(.)所需的交叉引用列时,横向主要有用。
备注
问题是关于LATERAL 1_column_expression而不是LATERAL multicolumn_subquery。示例:
SELECT x, y, exp, z
FROM (select 3) t(x), -- subquery
LATERAL round(x*0.2+1.2) as exp, -- expression!
LATERAL (SELECT exp+2.0 AS y, x||'foo' as z) t2 --subquery
;..。在@klin评论显示另一点的“指南”说“只有功能”之后,问题是为什么?必须以更具体的方式表达,改变问题的范围:
没有意义的“只有funcions",语法(x)或(x+1),封装在父母关系中的表达,是好的,不是吗?
为什么只有函数?
PS:也许将来会有计划,或者在解析泛型表达式时会遇到真正的问题.作为用户,我们必须向PostgreSQL开发人员展示什么是合理的,什么是我们需要的。
发布于 2022-10-02 22:19:02
如果您将它包装在它自己的子查询中,所有这些都会正常工作。
SELECT x, y FROM (select 1 as x) t, LATERAL (SELECT 2.0 AS y) z;发布于 2022-10-02 23:36:05
文字是列的有效值,但正如您引用的文档所述,使用了LATERAL语法。
用于计算要加入的行
关系(如FROM或JOIN或LATERAL子查询子句)总是计算(单个或多个)列的元组。您指定的别名不是针对单个行的,而是针对整个元组的。
发布于 2022-10-15 22:27:45
用直觉回答“为什么只起作用?”。
或者“为什么 PostgreSQL规范只使用函数?”。当然,这不是关于解析器的问题,因为它符合规范。
语法指南显示了我们唯一可以使用LATERAL的场合
[ LATERAL ] ( select ) [ AS ] alias [ ( column_alias [, ...] ) ] ...
[ LATERAL ] function_name ( [ argument [, ...] ] ) ...
[ LATERAL ] ROWS FROM( function_name ( [ argument [, ...] ] ) ...所以,没有冲突
[ LATERAL ] (single_expression) [ AS ] alias@Bergi的猜测是,像LATERAL 2.0 AS y这样的文字表达式可以解释为LATERAL "2"."0"、“表0”和“模式2”.但是,正如我们在上面看到的,在子句LATERAL后面期望一个表名是没有意义的,因此,实际上,没有歧义。
结论:看起来像LATERAL的规范,可以生长并允许使用表达式。
这是能够讨论和参与开放社区软件的最大优势!
为什么是LATERAL single_expression AS alias__?理由:
SELECT a, x, x+b AS y FROM t, LATERAL f(a) AS x,自然也会尝试表达式而不是函数。它被期望在一个“正交系统”,是任何程序员的直觉。a=b+c; x=a+y; z=a/2; ...。在SQL中执行"SELECT(SELECT(SELECT))“很难看,只用于重用表达式。“横向链”更优雅和可读性更强。
也许也更适合于查询优化。https://stackoverflow.com/questions/73929671
复制相似问题