2017-01-24 58 views
0

從數組元素我有一個Postgres數據庫表格如下:除去N-使用開始和結束索引

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

和陣列含有約500K的元件。

我想知道是否有一種更有效的方法來更新arr列,方法是從給定開始和結束索引的數組中刪除一組元素,或僅刪除要刪除的「n個第一個元素」的數目。

回答

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; 

cardinality()在9.4推出,如果您使用的是更老版本的語法,你需要:

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

你知道上述'update'是否會做新片的副本嗎?因爲我需要對大數組進行頻繁的刪除操作。 – saloua

+0

@saloua你是什麼意思與「新片的副本」?一個列總是寫完整(不是「件」),如果你指的是 –

+0

我在問是否在更新列值時,會有原始數組內容和新內容丟棄切片。然後,如果數組很大,我需要並行更新,這將是低效的。 – saloua

1

您可以使用切片(請參閱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) 
+0

感謝您的答案,但如果數組非常大,並且我需要經常執行刪除操作,那麼更新效率如何。 – saloua

+0

我認爲這是刪除元素的最有效方法。 – klin

+0

我確實這麼認爲,但它沒有:[示例](http://rextester.com/AWAGY72569)。我真的不知道爲什麼。 – klin

相關問題