使用开始和结束索引从数组中删除 n 个元素
Remove n elements from array using start and end index
我在 Postgres 数据库中有以下 table:
CREATE TABLE test(
id SERIAL NOT NULL,
arr int[] NOT NULL
)
数组包含大约 500k 个元素。
我想知道是否有一种有效的方法来更新 arr
列,方法是从给定开始和结束索引或仅 "n first elements" 的数量的数组中删除一组元素删除。
您可以使用切片(参见 8.15.3. Accessing Arrays)。
create table example
as select array[1,2,3,4,5,6,7,8] arr;
删除前 3 个元素:
select arr[4:8]
from example;
arr
-------------
{4,5,6,7,8}
(1 row)
从 4 到 5 删除元素:
select arr[1:3] || arr[6:8] as arr
from example;
arr
---------------
{1,2,3,6,7,8}
(1 row)
如果数组长度未知,删除前 5 个元素:
select arr[6:array_length(arr,1)]
from example;
arr
---------
{6,7,8}
(1 row)
您可以access单个元素或元素范围:
如果你想要删除元素5到8,你可以这样做:
select arr[1:4]||arr[9:]
from test;
或作为更新:
update test
set arr = arr[1:4]||arr[9:];
要删除 "first n elements",只需使用第 n+1 个元素之后的切片,例如删除前 5 个元素:
select arr[6:]
from test;
语法 arr[6:]
需要 Postgres 9.6 或更高版本,对于更早的版本,您需要
select arr[6:cardinality(arr)]
from test;
cardinality()
是在 9.4 中引入的,如果您使用的是更旧的版本,则需要:
select arr[6:array_lengt(arr,1)]
from test;
我在 Postgres 数据库中有以下 table:
CREATE TABLE test(
id SERIAL NOT NULL,
arr int[] NOT NULL
)
数组包含大约 500k 个元素。
我想知道是否有一种有效的方法来更新 arr
列,方法是从给定开始和结束索引或仅 "n first elements" 的数量的数组中删除一组元素删除。
您可以使用切片(参见 8.15.3. Accessing Arrays)。
create table example
as select array[1,2,3,4,5,6,7,8] arr;
删除前 3 个元素:
select arr[4:8]
from example;
arr
-------------
{4,5,6,7,8}
(1 row)
从 4 到 5 删除元素:
select arr[1:3] || arr[6:8] as arr
from example;
arr
---------------
{1,2,3,6,7,8}
(1 row)
如果数组长度未知,删除前 5 个元素:
select arr[6:array_length(arr,1)]
from example;
arr
---------
{6,7,8}
(1 row)
您可以access单个元素或元素范围:
如果你想要删除元素5到8,你可以这样做:
select arr[1:4]||arr[9:]
from test;
或作为更新:
update test
set arr = arr[1:4]||arr[9:];
要删除 "first n elements",只需使用第 n+1 个元素之后的切片,例如删除前 5 个元素:
select arr[6:]
from test;
语法 arr[6:]
需要 Postgres 9.6 或更高版本,对于更早的版本,您需要
select arr[6:cardinality(arr)]
from test;
cardinality()
是在 9.4 中引入的,如果您使用的是更旧的版本,则需要:
select arr[6:array_lengt(arr,1)]
from test;