7

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

在以下示例中,#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 个元素。我宁愿只得到一个数组。

我读过(除其他外):

而且我只是没有看到我在寻找什么。

4

1 回答 1

15

Postgres 数组元素始终是基本元素,即量值。子数组不是 Postgres 中的“元素”。数组切片保留原始尺寸。

您可以提取基本元素,它是标量元素数据类型的值。
或者您可以提取一个数组 slice,它保留原始数组数据类型以及原始数组维度。

您将子数组作为“元素”检索的想法会与此冲突,只是没有实现。

手册的解释可能更清楚。但至少我们可以发现:

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

您的第一个示例尝试引用未找到的基本元素(您需要二维数组中的两个数组索引)。所以 Postgres 返回 NULL。
您的第三个示例只是将生成的 NULL 包装在一个新数组中。

展平数组切片(使其成为一维数组),您可以unnest()将结果集提供给新的ARRAY构造函数。在相关子查询或LATERAL连接中(需要 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。

有关的:

于 2015-12-22T04:03:17.317 回答