Arrays 解引用postgres 2d数组

Arrays 解引用postgres 2d数组,arrays,postgresql,Arrays,Postgresql,因此,我注意到postgres(9.0)不喜欢只对一维二维数组进行解引用。这里有一个有趣的例子 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,

因此,我注意到postgres(9.0)不喜欢只对一维二维数组进行解引用。这里有一个有趣的例子

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}
。为了解决这个问题,我写了这个函数

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;
现在我可以写了:

WITH my_table(arr) AS ( VALUES (ARRAY[[10,11],[20,21]]) )
SELECT deref_2d(arr,1) FROM my_table;
 deref_2d
----------
 {10,11}

但这其中的许多因素让我对自己的解决方案感到不安。有更好的方法吗?

在注销之前,先考虑一下这部西部片的全部演员阵容:

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;
有更多的例子


手册和。

阵列切片FTW中的一些背景知识!谢谢你告诉我这个语法。这在哪里有记录?我只能找到博士后大多数细微差别的小例子(像这样)。@wesdotcool:在过去12年我与博士后的合作中,我学到了一些技巧。添加了手册的链接。