首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消引用postgres 2d数组

取消引用postgres 2d数组
EN

Stack Overflow用户
提问于 2013-02-07 11:37:22
回答 1查看 771关注 0票数 2

所以我注意到postgres (9.0)不喜欢你引用一个只有一维的二维数组。下面是一个有趣的例子

代码语言:javascript
复制
WITH my_table(arr) AS ( VALUES (ARRAY[[10,11],[20,21]]) )
SELECT arr[2][1] AS good, arr[1] AS bad FROM my_table;

 good | bad
------+-----
   20 |
(1 row)

如您所见,如果不指定第二个维度,则返回null。理想情况下,我希望它返回内部数组{10,11}。为了解决这个问题,我写了这个函数

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION deref_2d(orig_arr numeric[][], inner_arr int)
RETURNS numeric[] AS $$
DECLARE
  index int;
  len int;
  return_arr numeric[];
BEGIN
  len := array_upper(orig_arr,2);
  FOR index IN 1 .. len LOOP
    return_arr[index] := orig_arr[inner_arr][index];
  END LOOP;
  RETURN return_arr;
END
$$ LANGUAGE plpgsql;

现在我可以写下:

代码语言:javascript
复制
WITH my_table(arr) AS ( VALUES (ARRAY[[10,11],[20,21]]) )
SELECT deref_2d(arr,1) FROM my_table;
 deref_2d
----------
 {10,11}

但是,关于这一点的多件事让我对我的解决方案感到不安。有没有更好的方法来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-07 12:07:10

在你写下这部西部片之前,考虑一下它的全部演员阵容:

代码语言:javascript
复制
WITH tbl(arr) AS (SELECT (ARRAY[[10,11],[20,21]]))
SELECT arr[2][1]    AS the_good
      ,arr[1]       AS the_bad
      ,arr[1:1]     AS the_ugly   -- first slice of 2D-array
      ,arr[1][1:2]  AS the_ugly_twin -- 2D-array with elements 1 & 2 of 1st slice
      ,ARRAY((SELECT unnest(arr[1:1]))) AS the_righteous -- 1D-array of 1st slice
FROM   tbl;

上有更多的例子。

herehere手册中的一些背景知识。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14743097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档