如何在 PostgreSQL 中提取匿名行类型的字段

Tom*_*lis 3 postgresql composite-types

在 PostgreSQL 中我可以创建匿名行或复合类型

postgres=# SELECT ROW(1,'Hello',false) as r;
      r
-------------
 (1,Hello,f)
(1 row)
Run Code Online (Sandbox Code Playgroud)

但我怎样才能把这些田地重新拿出来呢?没有以下工作

postgres=# SELECT (r).* from (SELECT ROW(1,'Hello',false) as r) as T;
ERROR:  record type has not been registered

postgres=# SELECT (r).column0 from (SELECT ROW(1,'Hello',false) as r) as T;
ERROR:  record type has not been registered
Run Code Online (Sandbox Code Playgroud)

Pet*_*ier 10

v13 中的新功能

  • 允许ROW expressions使用后缀符号提取其成员 (Tom Lane)

    例如,(ROW(4, 5.0)).f1现在返回 4。

select (ROW(1,'Hello',false)).f1
Run Code Online (Sandbox Code Playgroud)

请注意,有一些问题。您可能需要显式转换类型

select (ROW(1,'Hello',false)).f2
Run Code Online (Sandbox Code Playgroud)

错误:找不到从未知到文本的转换函数

select (ROW(1,'Hello'::text,false)).f2
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅db<>fiddle

源代码中的相关提交似乎是8b7a0f1d11 ,并在https://www.postgresql.org/message-id/flat/10872.1572202006%40sss.pgh.pa.us进行了讨论

目前我还不知道有任何官方文档,但我会大声喊出 Jack@TA向我展示了新技巧。