我遇到了一篇关于使用generate_series创建表数据的简洁文章。作者在解释代码方面做得很好,但有些事情我还是不明白。别名comp3syl(x)
和z2(x)
之后的x是将派生表的列名分配给x?这个语法叫什么?我在浏览没有关键字的文档时遇到了麻烦
SELECT(
SELECT concat_ws(' ',name_first, name_last) as generated
FROM (
SELECT string_agg(x,'')
FROM (
select start_arr[ 1 + ( (random() * 25)::int) % 16 ]
FROM
(
select '{CO,GE,FOR,SO,CO,GIM,SE,CO,GE,CA,FRA,GEC,GE,GA,FRO,GIP}'::text[] as start_arr
) syllarr,
-- need 3 syllabes, and force generator interpretation with the '*0' (else 3 same syllabes)
generate_series(1, 3 + (generator*0))
) AS comp3syl(x)
) AS comp_name_1st(name_first),
(
SELECT x[ 1 + ( (random() * 25)::int) % 14 ]
FROM (
select '{Ltd,& Co,SARL,SA,Gmbh,United,Brothers,& Sons,International,Ext,Worldwide,Global,2000,3000}'::text[]
) AS z2(x)
) AS comp_name_last(name_last)
)
FROM generate_series(1,10000) as generator
对于任何感兴趣的人都是文章的链接:https://regilero.github.io/postgresql/english/2017/06/26/postgresql_advanced_generate_series/
答案 0 :(得分:2)
另一种形式的表别名为表的列以及表本身提供临时名称:
FROM table_reference [AS]别名(column1 [,column2 [,...]])
如果指定的列别名少于实际表中的列,则不会重命名其余列。此语法对自联接或子查询特别有用。
在您给出的generate_series()
调用的代码中,子查询本身没有别名,因此作者在为子查询添加别名时为其命名。
答案 1 :(得分:1)
在某些数据库中,但不是全部,表别名可以采用列别名列表。这是表别名所定义的列的引用方式。
考虑以下两个问题:
select *
from (values (1)) x;
select *
from (values (1)) x(a);
在第一个中,返回的一列是未命名的。在第二个中,该列称为“a”。
将其与generate_series()
一起使用的原因是该函数返回一列 - 实际上是一个非常有用的列。但是你怎么称呼呢?我通常使用类似gs(n)
的内容,因此该列称为gs.n
。您也可以只使用generate_series() n
,该列可以称为n
或n.n
。
对于子查询本身,我总是将列别名放在子查询中。并非所有数据库都支持使用表别名命名列,因此更容易在子查询中命名列。