從數組元素我有一個Postgres數據庫表格如下:除去N-使用開始和結束索引
CREATE TABLE test(
id SERIAL NOT NULL,
arr int[] NOT NULL
)
和陣列含有約500K的元件。
我想知道是否有一種更有效的方法來更新arr
列,方法是從給定開始和結束索引的數組中刪除一組元素,或僅刪除要刪除的「n個第一個元素」的數目。
從數組元素我有一個Postgres數據庫表格如下:除去N-使用開始和結束索引
CREATE TABLE test(
id SERIAL NOT NULL,
arr int[] NOT NULL
)
和陣列含有約500K的元件。
我想知道是否有一種更有效的方法來更新arr
列,方法是從給定開始和結束索引的數組中刪除一組元素,或僅刪除要刪除的「n個第一個元素」的數目。
您可以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;
cardinality()
在9.4推出,如果您使用的是更老版本的語法,你需要:
select arr[6:array_lengt(arr,1)]
from test;
您可以使用切片(請參閱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)
你知道上述'update'是否會做新片的副本嗎?因爲我需要對大數組進行頻繁的刪除操作。 – saloua
@saloua你是什麼意思與「新片的副本」?一個列總是寫完整(不是「件」),如果你指的是 –
我在問是否在更新列值時,會有原始數組內容和新內容丟棄切片。然後,如果數組很大,我需要並行更新,這將是低效的。 – saloua