PostgreSQL中别名后括号语法疑问:comp3syl(x)这类写法是什么?
PostgreSQL派生表列别名语法解析
嘿,我来帮你搞清楚这两个疑问:
1. comp3syl(x)和z2(x)里的x作用是什么?
没错!这个x就是用来给派生表的唯一一列指定列名的。
你看示例里的子查询,比如(select start_arr[...]) syllarr, generate_series(1, 3 + (generator*0))这个结果集只有一列,用AS comp3syl(x)就直接把这一列命名为x,后面的string_agg(x,'')才能直接引用这个列名做字符串聚合。同理z2(x)也是把那个数组查询返回的唯一一列命名为x,方便后续用数组索引取值。
这种写法比在子查询里写SELECT ... AS x更简洁,尤其适合结果集只有一列的场景。
2. 这个语法的官方名称是什么?
在PostgreSQL官方文档里,这种写法叫做派生表的列别名列表(column alias list for a derived table)。
你可以去PostgreSQL的SELECT语句语法章节里找相关内容,用关键词「derived table column aliases」就能定位到。简单来说:当你把子查询、函数生成的结果集(比如generate_series)作为FROM子句的数据源(也就是派生表)时,可以在派生表的别名后面用括号跟上列名列表,用来给结果集的每一列指定别名——如果只有一列,就只写一个列名就行,就是你看到的(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
内容的提问来源于stack exchange,提问作者Wolf_Tru
相关产品推荐
相关产品推荐

