2013-02-07 34 views
2

所以我注意到,postgres(9.0)不喜歡它,當你解引用一維2d數組。這裏有一個有趣的例子解引用postgres二維數組

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} 

但多件事情讓我覺得不安我的解決方案。有一個更好的方法嗎?

回答

3

考慮這個西方的全力施展你寫它之前關閉:有更多的例子

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; 

->sqlfiddle

手冊中的一些背景herehere

+0

陣列切片FTW!感謝您向我展示此語法。這在哪裏記錄?我只能找到大部分postgres細微差別的小例子(像這樣)。 – wesdotcool

+0

@wesdotcool:在過去的12年裏,我一直在與Postgres合作,我學到了一些技巧。增加了手冊的鏈接。 –