当前位置:  开发笔记 > 前端 > 正文

PostgreSQL多维数组

如何解决《PostgreSQL多维数组》经验,为你挑选了1个好方法。

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

在下面的例子中,#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

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



1> Erwin Brands..:

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阵列一级

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有