使用开始和结束索引从数组中删除 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;