arrays - 如何从二维数组中选择一维数组?

标签 arrays postgresql

我有二维数组,只想选择它的第一个元素,即一维数组。
我该怎么做?

最佳答案

获取 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;

SQL Fiddle.

关于arrays - 如何从二维数组中选择一维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25996237/

相关文章:

javascript - 遍历字符串中的数字

javascript - 如何在 JavaScript 中找到匹配 bool 条件的数组的第一个元素?

sql - PostgreSQL 将记录转换为复合类型

c# - 以编程方式插入字段值为 SQL 语句的行

windows - 如何在 Windows 7 上使用 PostgreSQL 8.4.7 以 "postgres"用户身份登录

postgresql - OpenShift PostgreSQL 数据库还原

javascript - 通过 IIFE 内的嵌套对象访问函数返回值

php - 如何在另外两个数组中拆分数组

postgresql - 如何为 pgAdmin 设置连接超时值?

Python - 根据值附加特定的 numpy 数组