Select every first element of array of integer arrays to array
Answer a question
How to select every first element of array of integer arrays to array?{{1,2,3},{2,15,32},{5,16,14},...} -> {1,2,5,...}
Answers
Since PostgreSQL will allow asking for a slice outside of the array size, and assuming there will never be more than 999 subarrays, we can use this monstrosity
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;
You can of course make the constant 999 larger if needed, it is just a random large number I threw in there.
The reason why this is so complicated is that if you would use just arr[1:999][1] you would still get a two-dimensional array, but with only the first elements. In this case {{1}, {2}, {5}}. If we use unnest() we can make it into a set, which can then be fed into array_agg() via subselect.
It would be nice to use array_agg(unnest(arr[1:999][1])) but the aggregation function doesn't like sets and I don't know if there is a way to convert it on the fly.
You can also use the actual array length, but it might cause unnecessary computation
SELECT unnest(arr[1:array_length(arr, 1)][1]) as arr from data
Note
If the arrays could be unnested by one level, you could just index the arrays and then use array_agg() to convert it back into an array with a lot simpler syntax
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;
The CTE is there just for input data, the actual meat is the array_agg(arr[1]). This will of course work for any number of input arrays.
更多推荐
所有评论(0)