PostgreSQL插入并从用户定义对象数组中选择

时间:2016-11-26 05:01:31

标签: sql postgresql

我在尝试学习PostgreSQL时遇到了一些问题。我创建了一个名为person的关系对象,然后创建了一个由主整数键和一个person对象组成的表。我感觉这是我在这个数组中插入行的方式,但我不确定如何访问该对象的特定列(例如,person.name)。

目前我能够插入行的唯一方法如下,但我认为它可能只是制作一个字符串对象而不是正确的人物对象。

INSERT INTO towns VALUES (0, '{"(bob,blue,springfield,33)"}');

作为参考,我创建的架构是:

CREATE TYPE person AS (
    name text,
    favorite_color text,
    hometown text,
    age integer
);

CREATE TABLE towns (
    town_id integer PRIMARY KEY,
    people person[]
);

3 个答案:

答案 0 :(得分:0)

您在这里组合了两件事,一个字段类型为array的复合类型person

要插入复合类型,您应该执行类似ROW("bob","blue","springfield",33)的操作,请注意ROW关键字是可选的

对于数组类型,您应该在单引号内使用括号,例如'{val1,val2}',在您的情况下,您只添加array的一个元素,其结果是person类型。

您的示例应如下所示:

INSERT INTO towns VALUES (0, '{ROW("bob","blue","springfield",33)}');

请注意,双引号适用于person类型内的值,而不适用于整个对象。

参考文献:Composite TypesArrays

要访问人员值,您必须将object包裹在()中,以便(person).name

答案 1 :(得分:0)

我能让这个工作的唯一方法是通过以下方式插入:

INSERT INTO towns VALUES (0, (array[ROW('bob','blue','springfield',33)::person]));

要选择你必须这样做:

select (people[1]).age from towns;

答案 2 :(得分:0)

这是我更喜欢array[...]语法优于'{...}'的原因之一。您不需要考虑嵌套引号:

INSERT INTO towns  (town_id, people)
  VALUES 
(0, array[('bob','blue','springfield',33)::person]);

('bob','blue','springfield',33)::person创建类型personarray[...]的记录,使其成为单个元素数组。您必须将使用(...)创建的匿名记录强制转换为人员才能使其正常工作。如果你想在数组中插入多个人的记录,那么在整个数组结尾处输入的内容会少一些:

array[('bob','blue','springfield',33), ('arthur','red','sleepytown',42)]::person[]

要选择数组中记录的特定元素,可以使用例如:

select town_id, people[1].name
from towns