使用start和end索引从数组中删除n个元素

时间:2017-01-24 14:32:22

标签: sql arrays postgresql postgresql-9.4

我在Postgres数据库中有以下表格:

CREATE TABLE test(
  id SERIAL NOT NULL,
  arr int[] NOT NULL
)

该数组包含大约500k个元素。

我想知道是否有一种有效的方法来更新arr列,方法是在给定开始和结束索引的情况下从数组中删除一组元素,或者只删除第一个元素的数量" 34;删除。

2 个答案:

答案 0 :(得分:2)

您可以使用切片(请参阅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)

答案 1 :(得分:2)

您可以access个别元素或元素范围:

如果你是想要删除元素5到8,你可以这样做:

select arr[1:4]||arr[9:]
from test;

或作为更新:

update test
   set arr = arr[1:4]||arr[9:];

要删除"前n个元素",只需使用n + 1个元素之后的切片,例如删除前5个元素:

select arr[6:]
from test;

语法arr[6:]需要Postgres 9.6或更高版本,适用于您需要的早期版本

select arr[6:cardinality(arr)]
from test;
在9.4中引入了

cardinality(),如果您使用的是更旧的版本,则需要:

select arr[6:array_lengt(arr,1)]
from test;