在 PostgreSQL 中对二维数组进行切片时的行为不一致
Inconsistent behavior when slicing a 2d array in PostgreSQL
假设我有一个二维数组:
# SELECT ARRAY[ARRAY[1,2], ARRAY[3,4]];
array
---------------
{{1,2},{3,4}}
(1 row)
现在,如果我想获得每个内部数组的 第一个元素 ,添加 (...)[:][1]
就可以了:
# SELECT (ARRAY[ARRAY[1,2], ARRAY[3,4]])[:][1];
array
-----------
{{1},{3}}
(1 row)
BUT:如果我想获得每个内部数组的第二个元素,我必须选择添加(...)[:][2:2]
,因为 (...)[:][2]
会再次 return 未触及的数组
# SELECT (ARRAY[ARRAY[1,2], ARRAY[3,4]])[:][2];
array
---------------
{{1,2},{3,4}}
(1 row)
# SELECT (ARRAY[ARRAY[1,2], ARRAY[3,4]])[:][2:2];
array
-----------
{{2},{4}}
(1 row)
这种不一致行为的原因是什么?
我认为 documentation 很好地解释了这一点:
If any dimension is written as a slice, i.e., contains a colon, then all dimensions are treated as slices. Any dimension that has only a single number (no colon) is treated as being from 1 to the number specified.
也就是说,当您使用切片时,Postgres 期望 所有 维度都是切片。没有的默认为1:n
.
假设我有一个二维数组:
# SELECT ARRAY[ARRAY[1,2], ARRAY[3,4]];
array
---------------
{{1,2},{3,4}}
(1 row)
现在,如果我想获得每个内部数组的 第一个元素 ,添加 (...)[:][1]
就可以了:
# SELECT (ARRAY[ARRAY[1,2], ARRAY[3,4]])[:][1];
array
-----------
{{1},{3}}
(1 row)
BUT:如果我想获得每个内部数组的第二个元素,我必须选择添加(...)[:][2:2]
,因为 (...)[:][2]
会再次 return 未触及的数组
# SELECT (ARRAY[ARRAY[1,2], ARRAY[3,4]])[:][2];
array
---------------
{{1,2},{3,4}}
(1 row)
# SELECT (ARRAY[ARRAY[1,2], ARRAY[3,4]])[:][2:2];
array
-----------
{{2},{4}}
(1 row)
这种不一致行为的原因是什么?
我认为 documentation 很好地解释了这一点:
If any dimension is written as a slice, i.e., contains a colon, then all dimensions are treated as slices. Any dimension that has only a single number (no colon) is treated as being from 1 to the number specified.
也就是说,当您使用切片时,Postgres 期望 所有 维度都是切片。没有的默认为1:n
.