PostgreSQL多维数组

9
我试图将数据作为多维数组传递,并且我得到了一些看起来很奇怪的行为。具体而言,我试图从二维数组中获取单个元素(因此从我的二维数组中获取一个一维数组),但它并不按照我期望的方式工作。
在以下示例中,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个回答

19

Postgres数组的元素始终是基本元素,即非数组类型。在Postgres中,子数组不是"元素"。数组切片保留原始尺寸。

您可以提取base element(基本元素),带有元素数据类型;或者您可以提取一个保留原始数组数据类型和原始数组尺寸的array slice(数组切片)。

试图将子数组作为“元素”检索的想法将与此冲突,并且未被实现。

手册的解释可能需要更清晰。 但至少我们可以找到:

如果任何维度都写成切片形式,即包含冒号,则所有维度都视为切片。只有一个数字的任何维度(没有冒号)将被视为从1到指定数字。例如,[2]被视为[1:2]

您的第一个示例试图引用未找到的基本元素(在二维数组中需要两个数组索引的下标)。因此,Postgres返回NULL。
您的第三个示例只是将结果为NULL的内容包装在一个新数组中。

展开数组切片(使其成为1D数组),可以使用unnest()并将生成的集合提供给新的ARRAY构造函数。可以在相关子查询或LATERAL join(需要pg 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。

相关内容:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接