Sha*_*pov 5 arrays postgresql plpgsql
如何选择整数数组的每个第一个元素到数组?
{{1,2,3},{2,15,32},{5,16,14},...}- >{1,2,5,...}
由于 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;
当然,如果需要的话,你可以将常数 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
笔记
如果数组可以取消一级嵌套,您只需对数组进行索引,然后使用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;
CTE 只是用于输入数据,实际的内容是array_agg(arr[1]). 这当然适用于任意数量的输入数组。
| 归档时间: | 
 | 
| 查看次数: | 5030 次 | 
| 最近记录: |