从复合类型数组中获取第一个值
Getting first values from composite type arrays
CREATE TABLE people(
name_ varchar(50) NOT NULL,
count int NOT NULL DEFAULT 0
);
CREATE TABLE person_added(
date_ date NOT NULL,
all_people_ people[],
all_people_count int NOT NULL
);
CREATE TABLE all_people_array_table(
id SERIAL,
people_array person_added[]
);
{"(2016-02-27,{(Jack,3),(John,6)},1000)","(2016-03-27,{(Ben,3),(Francis,6)},2000)"}
people_array
包含 person_added
种复合类型。我需要在这个数组中获取日期。 (2016-02-27 和 2016-03-27)
我想我需要使用切片,但它对我不起作用。
您可以使用 unnest()
function 将数组转换为一组行:
SELECT date_
FROM all_people_array_table, unnest(people_array);
unnest()
函数是一个 table 函数,因此您可以像使用 table 名称一样使用它。此类 table 函数可以使用先前指定关系中的列(请参阅上面 link 部分之后的 "LATERAL Subqueries" 部分)。
但是您真的应该检查一下您的 table 设计。像这样使用数组会破坏数据的关系结构。您的设计看起来更像是 hierarchical model,1960 年代的数据库设计范例。不使用数组,而是使用从一个 table 到下一个
的键
CREATE TABLE people(
name_ varchar(50) NOT NULL,
count int NOT NULL DEFAULT 0
);
CREATE TABLE person_added(
date_ date NOT NULL,
all_people_ people[],
all_people_count int NOT NULL
);
CREATE TABLE all_people_array_table(
id SERIAL,
people_array person_added[]
);
{"(2016-02-27,{(Jack,3),(John,6)},1000)","(2016-03-27,{(Ben,3),(Francis,6)},2000)"}
people_array
包含 person_added
种复合类型。我需要在这个数组中获取日期。 (2016-02-27 和 2016-03-27)
我想我需要使用切片,但它对我不起作用。
您可以使用 unnest()
function 将数组转换为一组行:
SELECT date_
FROM all_people_array_table, unnest(people_array);
unnest()
函数是一个 table 函数,因此您可以像使用 table 名称一样使用它。此类 table 函数可以使用先前指定关系中的列(请参阅上面 link 部分之后的 "LATERAL Subqueries" 部分)。
但是您真的应该检查一下您的 table 设计。像这样使用数组会破坏数据的关系结构。您的设计看起来更像是 hierarchical model,1960 年代的数据库设计范例。不使用数组,而是使用从一个 table 到下一个
的键