不使用 ARRAY[] 的嵌套复合类型数组的语法
Syntax for array of nested composite type without using ARRAY[]
CREATE TYPE pencil_count AS(
pencil_color varchar(30),
count integer
);
CREATE TYPE pencil_count_with_date(
date_ date,
pencil_count pencil_count[]
);
CREATE TABLE pencils(id serial, pencils_ pencil_count_with_date[]);
INSERT INTO pencils(pencils_)
VALUES('{"(\"2016-03-13\",{"(\"blue\",1)","(\"red\",2)"})"}');
如果我想在不使用 ARRAY[...]
的情况下添加此复合数组,正确的语法是什么?
添加新的嵌套级别时,使用文字字符串的可读性会降低:
CREATE TYPE pencil_count AS(pencil_color varchar(30)
,"count" int);
CREATE TYPE pencil_count_with_date AS(date_ date
,pencil_count pencil_count[]);
CREATE TABLE pencils(id serial, pencils_ pencil_count_with_date[]);
INSERT INTO pencils(pencils_)
VALUES('{"(
\"2016-03-13\",
\"{
\"\"(Blue,5)\"\",
\"\"(Red,2)\"\"
}\"
)"}');
SELECT pencils_[1].pencil_count[1].pencil_color
FROM pencils;
备注:
再次询问 Postgres。扩展 的程序:
CREATE TEMP TABLE pencil_count (
pencil_color varchar(30)
, count integer
);
CREATE TABLE pencil_count_with_date (
date_ date,
pencil_count pencil_count[]
);
CREATE TABLE pencils (
id serial
, pencils_ pencil_count_with_date[]
);
向 Postgres 询问每个嵌套级别:
INSERT INTO pencil_count VALUES ('red' , 1), ('blue', 2);
SELECT ARRAY(SELECT p FROM pencil_count p)::text AS p_row_arr;
-- with result from above:
INSERT INTO pencil_count_with_date(date_, pencil_count)
VALUES ('2016-04-14', '{"(red,1)","(blue,2)"}')
, ('2016-04-14', '{"(red,3)","(blue,4)"}');
SELECT ARRAY(SELECT p FROM pencil_count_with_date p)::text AS p2_row_arr;
-- with result from above:
INSERT INTO pencils(pencils_)
VALUES
('{"(2016-04-14,\"{\"\"(red,1)\"\",\"\"(blue,2)\"\"}\")"
,"(2016-04-15,\"{\"\"(red,3)\"\",\"\"(blue,4)\"\"}\")"}');
SELECT id, pencils_::text FROM pencils;
结果:
id | pencils_
---+-------------------------------------------------------
1 | {"(2016-04-14,\"{\"\"(red,1)\"\",\"\"(blue,2)\"\"}\")"
,"(2016-04-15,\"{\"\"(red,3)\"\",\"\"(blue,4)\"\"}\")"}
到目前为止,我完全同意以下建议:多层嵌套行类型通常很复杂且效率低下。考虑归一化。
更多内容在我对你之前问题的回答中:
CREATE TYPE pencil_count AS(
pencil_color varchar(30),
count integer
);
CREATE TYPE pencil_count_with_date(
date_ date,
pencil_count pencil_count[]
);
CREATE TABLE pencils(id serial, pencils_ pencil_count_with_date[]);
INSERT INTO pencils(pencils_)
VALUES('{"(\"2016-03-13\",{"(\"blue\",1)","(\"red\",2)"})"}');
如果我想在不使用 ARRAY[...]
的情况下添加此复合数组,正确的语法是什么?
添加新的嵌套级别时,使用文字字符串的可读性会降低:
CREATE TYPE pencil_count AS(pencil_color varchar(30)
,"count" int);
CREATE TYPE pencil_count_with_date AS(date_ date
,pencil_count pencil_count[]);
CREATE TABLE pencils(id serial, pencils_ pencil_count_with_date[]);
INSERT INTO pencils(pencils_)
VALUES('{"(
\"2016-03-13\",
\"{
\"\"(Blue,5)\"\",
\"\"(Red,2)\"\"
}\"
)"}');
SELECT pencils_[1].pencil_count[1].pencil_color
FROM pencils;
备注:
再次询问 Postgres。扩展
CREATE TEMP TABLE pencil_count (
pencil_color varchar(30)
, count integer
);
CREATE TABLE pencil_count_with_date (
date_ date,
pencil_count pencil_count[]
);
CREATE TABLE pencils (
id serial
, pencils_ pencil_count_with_date[]
);
向 Postgres 询问每个嵌套级别:
INSERT INTO pencil_count VALUES ('red' , 1), ('blue', 2);
SELECT ARRAY(SELECT p FROM pencil_count p)::text AS p_row_arr;
-- with result from above:
INSERT INTO pencil_count_with_date(date_, pencil_count)
VALUES ('2016-04-14', '{"(red,1)","(blue,2)"}')
, ('2016-04-14', '{"(red,3)","(blue,4)"}');
SELECT ARRAY(SELECT p FROM pencil_count_with_date p)::text AS p2_row_arr;
-- with result from above:
INSERT INTO pencils(pencils_)
VALUES
('{"(2016-04-14,\"{\"\"(red,1)\"\",\"\"(blue,2)\"\"}\")"
,"(2016-04-15,\"{\"\"(red,3)\"\",\"\"(blue,4)\"\"}\")"}');
SELECT id, pencils_::text FROM pencils;
结果:
id | pencils_
---+-------------------------------------------------------
1 | {"(2016-04-14,\"{\"\"(red,1)\"\",\"\"(blue,2)\"\"}\")"
,"(2016-04-15,\"{\"\"(red,3)\"\",\"\"(blue,4)\"\"}\")"}
到目前为止,我完全同意以下建议:多层嵌套行类型通常很复杂且效率低下。考虑归一化。
更多内容在我对你之前问题的回答中: