选择整数数组数组的每个第一个元素到数组

Sha*_*pov 5 arrays postgresql plpgsql

如何选择整数数组的每个第一个元素到数组?
{{1,2,3},{2,15,32},{5,16,14},...}- >{1,2,5,...}

Sam*_*nen 4

由于 PostgreSQL 允许请求数组大小之外的切片,并且假设子数组永远不会超过 999 个,所以我们可以使用这个庞然大物

WITH data AS (
  SELECT array[array[1,2,3], array[2,15,32], array[5,16,14]] as arr)
SELECT array_agg(arr)
  FROM (SELECT unnest(arr[1:999][1]) as arr from data) data2;
Run Code Online (Sandbox Code Playgroud)

当然,如果需要的话,你可以将常数 999 调大,它只是我放入其中的一个随机大数。

之所以如此复杂,是因为如果您只使用它,arr[1:999][1]您仍然会得到一个二维数组,但只有第一个元素。在这种情况下{{1}, {2}, {5}}。如果我们使用,我们可以将其放入一个集合中,然后可以通过子选择unnest()将其输入。array_agg()

使用起来会很好,array_agg(unnest(arr[1:999][1]))但是聚合函数不喜欢集合,而且我不知道是否有办法动态转换它。

您也可以使用实际的数组长度,但这可能会导致不必要的计算

SELECT unnest(arr[1:array_length(arr, 1)][1]) as arr from data
Run Code Online (Sandbox Code Playgroud)

笔记

如果数组可以取消一级嵌套,您只需对数组进行索引,然后使用array_agg()更简单的语法将其转换回数组

WITH data AS
  (SELECT array[1,2,3] as arr
   UNION ALL SELECT array[2,15,32] as arr
   UNION ALL SELECT array[5,16,14] as arr)
SELECT array_agg(arr[1]) from data;
Run Code Online (Sandbox Code Playgroud)

CTE 只是用于输入数据,实际的内容是array_agg(arr[1]). 这当然适用于任意数量的输入数组。