そのため、1次元のみの2次元配列を逆参照すると、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
、2番目の次元を指定しない場合にこれが返されます。理想的には、内部配列を返すようにしたい{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}
しかし、これに関する複数のことが、自分の解決策に不安を感じさせます。これを行うためのより良い方法はありますか?