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

sal*_*oua 5 sql arrays postgresql postgresql-9.4

我在 Postgres 数据库中有下表:

CREATE TABLE test(
  id SERIAL NOT NULL,
  arr int[] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

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

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

小智 10

您可以访问单个元素或元素范围:

例如,如果您想删除元素 5 到 8,您可以这样做:

select arr[1:4]||arr[9:]
from test;
Run Code Online (Sandbox Code Playgroud)

或作为更新:

update test
   set arr = arr[1:4]||arr[9:];
Run Code Online (Sandbox Code Playgroud)

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

select arr[6:]
from test;
Run Code Online (Sandbox Code Playgroud)

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

select arr[6:cardinality(arr)]
from test;
Run Code Online (Sandbox Code Playgroud)

cardinality()是在 9.4 中引入的,如果您使用的是更旧的版本,您需要:

select arr[6:array_lengt(arr,1)]
from test;
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望提高效率,请不要使用数组,而应使用正确规范化的一对多关系。 (2认同)