PostgreSQL中如何手动创建RECORD类型的行数组?
如何在PostgreSQL中手动创建行数组?
PostgreSQL不支持直接将字符串转换为匿名RECORD类型(这就是你遇到ERROR: input of anonymous composite types is not implemented错误的原因),必须指定明确的复合类型才能构造行数组,以下是几种可行方法:
方法1:创建自定义复合类型
先定义一个有明确结构的复合类型,再用它来构造数组:
-- 创建自定义复合类型 CREATE TYPE person AS (first_name text, last_name text); -- 构造行数组 SELECT ARRAY['(John,Smith)'::person, '(David,Miller)'::person];
也可以用ROW()构造器直接生成行元素,再转换为目标类型数组:
SELECT ARRAY[ROW('John', 'Smith'), ROW('David', 'Miller')]::person[];
方法2:利用现有表的行类型
如果数据库中已有对应结构的表(比如名为person的表,包含first_name和last_name字段),可以直接复用表的行类型:
SELECT ARRAY[ROW('John', 'Smith'), ROW('David', 'Miller')]::person[];
方法3:临时复合类型(会话级)
如果不想创建永久类型,可以创建会话级的临时类型:
CREATE TEMP TYPE person AS (first_name text, last_name text); SELECT ARRAY[ROW('John', 'Smith'), ROW('David', 'Miller')]::person[];
为什么原方法失败?
RECORD是匿名复合类型,PostgreSQL无法从字符串'(John,Smith)'推断出它的字段结构和类型,因此必须指定一个有明确定义的复合类型(自定义类型或表行类型),才能完成字符串到行类型的转换,进而构造行数组。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

