我有二维数组,只想选择它的第一个元素,即一维数组。
我该怎么做?
最佳答案
获取 array 的第一个切片 :
SELECT my_arr[1:1];
生成的数组具有与输入相同的数组维度。
我之前的回答中的详细信息:
要扁平化结果:
SELECT ARRAY(SELECT unnest(my_arr[1:1]));
或清洁工:
SELECT ARRAY(SELECT * FROM unnest(my_arr)[1:1]));
例子
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1];
结果:
{{1,2,3}} -- 2D array
或者:
SELECT ARRAY(
SELECT unnest((ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1])
);
结果:
{1,2,3} -- 1D array
在 Postgres 8.3 中模拟 unnest()
回复您的评论:
Wiki page you are linking to有点误导。我用二维数组的代码更新了它。
unnest()
一维数组:
CREATE OR REPLACE FUNCTION unnest_1d(anyarray)
RETURNS SETOF anyelement AS
$func$
SELECT $1[i]
FROM generate_series(array_lower($1,1), array_upper($1,1)) i
$func$ LANGUAGE sql IMMUTABLE;
unnest()
用于二维数组:
CREATE OR REPLACE FUNCTION unnest_2d(anyarray)
RETURNS SETOF anyelement AS
$func$
SELECT $1[d1][d2]
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
$func$ LANGUAGE sql IMMUTABLE;
聚合函数 array_agg()
在 Postgres 8.3 中默认没有安装:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC = array_append,
STYPE = anyarray,
INITCOND = '{}'
);
将二维数组取消嵌套到一维数组:
CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
GROUP BY d1
ORDER BY d1
$func$ LANGUAGE sql IMMUTABLE;
关于arrays - 如何从二维数组中选择一维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25996237/