所以我注意到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}但是,关于这一点的多件事让我对我的解决方案感到不安。有没有更好的方法来做这件事?
发布于 2013-02-07 12:07:10
在你写下这部西部片之前,考虑一下它的全部演员阵容:
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;上有更多的例子。
here和here手册中的一些背景知识。
https://stackoverflow.com/questions/14743097
复制相似问题