我试图将数据作为一个多维数组传递,我的行为对我来说似乎很奇怪.具体来说,我试图从二维数组中获取单个元素(因此我的二维数组中的一维数组),并且它不能按照我期望的方式工作.
在下面的例子中,#2,4和5以我期望的方式工作,但1和3没有.
db=> select s.col[2] from (select array[[1,2,3],[4,5,6]] as col) s; col ----- (1 row) db=> select s.col[2:2] from (select array[[1,2,3],[4,5,6]] as col) s; col ----- {{4,5,6}} (1 row) db=> select array[s.col[2]] from (select array[[1,2,3],[4,5,6]] as col) s; array -------- {NULL} (1 row) db=> select array[s.col[2:2]] from (select array[[1,2,3],[4,5,6]] as col) s; array ------------- {{{4,5,6}}} (1 row) db=> select s.col[2][1] from (select array[[1,2,3],[4,5,6]] as col) s; col ----- 4 (1 row)
有这方面的文件吗?我现在有一些对我来说运作良好的东西,但它很难看,我担心它不会做我想做的事情.从技术上讲,我得到一个二维数组,其中1维只有1个元素.我宁愿得到一个阵列.
我读过(其中包括):
http://www.postgresql.org/docs/9.1/static/arrays.html
http://www.postgresql.org/docs/9.1/static/functions-array.html
http://www.postgresql.org/docs/9.1/static/sql-expressions.html#SQL-SYNTAX-ARRAY-CONSTRUCTORS
我只是没有看到我在寻找什么.
Postgres数组元素始终是基本元素,即标量值.子阵列不是Postgres中的"元素".数组切片保留原始尺寸.
您可以提取基本元素,它是标量元素数据类型的值.
或者,您可以提取数组切片,该切片保留原始数组数据类型以及原始数组维度.
您将子数组检索为"元素"的想法将与此冲突,并且尚未实现.
手册可能更清楚解释.但至少我们可以找到:
如果任何维度被写为切片,即包含冒号,则所有维度都被视为切片.任何只有一个数字(无冒号)的维度都被视为从1到指定的数字.例如,
[2]
被视为[1:2]
......
您的第一个示例尝试引用未找到的基本元素(在二维数组中需要两个数组索引).所以Postgres返回NULL.
您的第3个示例只是将结果NULL包装在一个新数组中.
要展平数组切片(使其成为1-D数组),您可以unnest()
将结果集提供给新的ARRAY
构造函数.在相关子查询中或在LATERAL
连接中(需要第9.3+页).展示两者:
SELECT s.col[2:2][2:3] AS slice_arr , x.lateral_arr , ARRAY(SELECT unnest(s.col[2:2][2:3])) AS corr_arr FROM (SELECT ARRAY[[1,2,3],[4,5,6]] AS col) s , LATERAL (SELECT ARRAY(SELECT * FROM unnest(s.col[2:2][2:3])) AS lateral_arr) x;
请务必阅读本手册的当前版本.你的引用指向Postgres 9.1,但你实际上可能正在使用Postgres 9.4.
有关:
如何从2d数组postgresql中选择1d数组
Unnest阵列一级