Sql 使用开始和结束索引从数组中删除n个元素

Sql 使用开始和结束索引从数组中删除n个元素,sql,arrays,postgresql,postgresql-9.4,Sql,Arrays,Postgresql,Postgresql 9.4,我在Postgres数据库中有下表: CREATE TABLE test( id SERIAL NOT NULL, arr int[] NOT NULL ) 该阵列包含大约500k个元素 我想知道是否有一种有效的方法来更新arr列,方法是在给定开始和结束索引的情况下从数组中删除一组元素,或者仅删除“n个第一个元素”的数量。您可以使用切片(请参阅) 删除前3个元素: select arr[4:8] from example; arr ------------- {

我在Postgres数据库中有下表:

CREATE TABLE test(
  id SERIAL NOT NULL,
  arr int[] NOT NULL
)
该阵列包含大约500k个元素

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

您可以使用切片(请参阅)

删除前3个元素:

select arr[4:8]
from example;

     arr     
-------------
 {4,5,6,7,8}
(1 row)
select arr[6:]
from test;
从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)
您可以选择单个图元或图元范围:

select arr[4:8]
from example;

     arr     
-------------
 {4,5,6,7,8}
(1 row)
select arr[6:]
from test;
例如,如果您想删除元件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[4:8]
from example;

     arr     
-------------
 {4,5,6,7,8}
(1 row)
select arr[6:]
from test;
语法
arr[6:][/code>需要Postgres 9.6或更高版本,对于您需要的早期版本

select arr[6:cardinality(arr)]
from test;
cardinality()
是在9.4中引入的,如果您使用的是更旧的版本,则需要:

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

谢谢你的回答,但是如果数组非常大,我需要频繁地删除,那么更新的效率会有多高?我认为这是删除元素的最有效的方法。@a_horse_,没有名字,在
psql
中它对我也不起作用。我收到错误:语法错误在“]”处或附近。@saloua:你使用的是哪个Postgres版本?这对我有用:@saloua:ah,这是在9.6中引入的,你知道提到的
更新
是否会复制新的片段吗?因为我需要频繁地删除大数组。@saloua“新切片的副本”是什么意思?如果您指的是完整的列(而不是“片段”),那么我想问的是,在更新列值时,是否会有原始数组内容和丢弃切片的新内容。然后,如果数组很大,我需要并行更新,这将是低效的。如果您希望这更高效,请不要使用数组,使用正确规范化的一对多关系。