PostgreSQL多维数组

use*_*898 6 arrays postgresql multidimensional-array unnest

我试图将数据作为一个多维数组传递,我的行为对我来说似乎很奇怪.具体来说,我试图从二维数组中获取单个元素(因此我的二维数组中的一维数组),并且它不能按照我期望的方式工作.

在下面的例子中,#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)
Run Code Online (Sandbox Code Playgroud)

有这方面的文件吗?我现在有一些对我来说运作良好的东西,但它很难看,我担心它不会做我想做的事情.从技术上讲,我得到一个二维数组,其中1维只有1个元素.我宁愿得到一个阵列.

我读过(其中包括):

我只是没有看到我在寻找什么.

Erw*_*ter 6

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;
Run Code Online (Sandbox Code Playgroud)

请务必阅读本手册当前版本.你的引用指向Postgres 9.1,但你实际上可能正在使用Postgres 9.4.

有关: