首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么横向不适用于价值观?

为什么横向不适用于价值观?
EN

Stack Overflow用户
提问于 2022-10-02 22:07:26
回答 3查看 88关注 0票数 0

它没有意义,文字不是有效的列?

代码语言:javascript
复制
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。示例:

代码语言:javascript
复制
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开发人员展示什么是合理的,什么是我们需要的。

EN

回答 3

Stack Overflow用户

发布于 2022-10-02 22:19:02

如果您将它包装在它自己的子查询中,所有这些都会正常工作。

代码语言:javascript
复制
SELECT x, y FROM (select 1 as x) t, LATERAL (SELECT 2.0 AS y) z;
票数 0
EN

Stack Overflow用户

发布于 2022-10-02 23:36:05

文字是列的有效值,但正如您引用的文档所述,使用了LATERAL语法。

用于计算要加入的

关系(如FROMJOINLATERAL子查询子句)总是计算(单个或多个)列的元组。您指定的别名不是针对单个行的,而是针对整个元组的。

票数 0
EN

Stack Overflow用户

发布于 2022-10-15 22:27:45

用直觉回答“为什么只起作用?”

或者“为什么 PostgreSQL规范只使用函数?”。当然,这不是关于解析器的问题,因为它符合规范。

语法指南显示了我们唯一可以使用LATERAL的场合

代码语言:javascript
复制
[ LATERAL ] ( select ) [ AS ] alias [ ( column_alias [, ...] ) ] ...
[ LATERAL ] function_name ( [ argument [, ...] ] ) ...
[ LATERAL ] ROWS FROM( function_name ( [ argument [, ...] ] ) ...

所以,没有冲突

代码语言:javascript
复制
[ LATERAL ] (single_expression) [ AS ] alias

@Bergi的猜测是,像LATERAL 2.0 AS y这样的文字表达式可以解释为LATERAL "2"."0"、“表0”和“模式2”.但是,正如我们在上面看到的,在子句LATERAL后面期望一个表名是没有意义的,因此,实际上,没有歧义。

结论:看起来像LATERAL的规范,可以生长并允许使用表达式。

这是能够讨论和参与开放社区软件的最大优势!

为什么是LATERAL single_expression AS alias__?理由:

  • 要保持正交性:任何PostgreSQL的新用户,如果看到了有效的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))“很难看,只用于重用表达式。“横向链”更优雅和可读性更强。 也许也更适合于查询优化。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73929671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档