2016-04-30 34 views
0

我有一個表,我添加了一列varchar colorcode。在PostgreSQL中基於varchar數組的表的更新列

該表已經有很多行。加入的ColorCode柱後表的狀態是

id name    location  colorcode 
121 Royal Challengers Bangalore  
122 Sun Risers   Hyderabad 
123 Dare Devils  Delhi 
124 Gujrat Lions  Ahmadabad 

我的顏色代碼

["#FF8484", "#FF82A9", "#FA82FF", "#C682FF", "#8782FF"] 

對於表中的每一行我必須由具有(ROW_NUMBER匹配陣列的索引更新的ColorCode列陣列( ) - 1)。

我在處理使用「in」子句時的值列表。

例如:

select * from table where id in(1,2,3,4) etc 

這裏1,2,3,4不過是一個數組

我要更新類似線路的ColorCode列,但我不知道如何訪問我的數組基於索引的元素。

運行更新語句之後,我的預期輸出是

id name    location  colorcode 
121 Royal Challengers Bangalore  #FF8484 
122 Sun Risers   Hyderabad  #FF82A9 
123 Dare Devils  Delhi   #FA82FF 
124 Gujrat Lions  Ahmedabad  #C682FF 

我可以根據ID即排序結果,主鍵

注:我使用的是Postgres

+0

更新的預期結果是什麼?爲什麼你需要參考前一行?以及「以前」是如何定義的?您可以對哪些屬性進行排序? [編輯]你的問題,並添加一些示例數據和預期的結果(_formatted_文本請[,無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images代碼的時候提出問題/ 285557#285557)) –

+0

我編輯了這個問題並添加了更新的預期結果。我不需要參考前一行。 row_number() - 1是爲了確保顏色代碼對應於數組索引row_number()是基於1的,而數組索引是基於0(我認爲),以彌補我正在做的row_number()-1。您可以根據ID – curiosa

回答

2

你可以做如下。我假設你的表稱爲

update t 
set colorcode = middle.cc 
from (
     select id, ('{#FF8484,#FF82A9,#FA82FF,#C682FF,#8782FF}'::text[])[rn] as cc 
     from (select id, row_number() over (order by id) as rn from t) as base 
     where rn <= 5 
     ) as middle 
where middle.id = t.id; 

在最內層查詢(基地),行數爲表中的每個記錄中檢索。然後在中間查詢(中間)中使用該行號從文本元素的內嵌數組中提取對應的顏色代碼。最後,更新聲明再次將該結果與表t結合,其id,以便存儲該顏色代碼。

+0

@curiosa對行進行排序,這是否解決了您的問題?你可以提供一些反饋嗎? – trincot

+0

對不起,延遲迴復,輝煌答案@trincot這正是我正在尋找 – curiosa

+0

不客氣。 – trincot