2012-12-22 40 views
3

可能重複:
convert MySQL SET data type to Postgresarray_append如果元素不存在

我的PostgreSQL 8.4。

我試圖建立沒有成功的查詢。如果元素不在conserning行中,我想將元素插入到數組中。

表 「測試」:

+------------------+------------------+ 
| id    | varchar(20)  | 
| timestp   | timestamp  | 
| place   | varchar(20)  | 
| myarray[][]  | varchar[14][254] | 
+------------------+------------------+ 

+---------+---------------------+-----------+----------------+ 
| xyz | 2010-01-01 10:10:10 | nowhere | "{abc,qwert}" | 
+---------+---------------------+-----------+----------------+ 

所以我想補充 「{FGH,gfdsa}」 到MYARRAY WHERE(ID = '某某' AND timestp =「2010-01-01 10:10 :10" ,地點=‘無處’)如果不是已經在myArray的

我想這樣的事情>

UPDATE test 
SET myarray = array_append(wascon2,'{fgh,gfdsa}') 
WHERE (id='xyz' AND timestp="2010-01-01 10:10:10" AND place='nowhere' 
AND NOT EXISTS 1 FROM test WHERE (myarray='{fgh,gfdsa}'))); 

這不工作,它會在每次當我打電話時數組追加它。

+---+---------------------------+-------------------------------------------+ 
|xyz|2010-01-01 10:10:10|nowhere|{"{abc,qwert}","{fgh,gfdsa}","{fgh,gfdsa}"}| 
+---+---------------------------+-------------------------------------------+ 

如果想我應該用>

myarray = ANY ('{fgh,gfds}'::varchar[]) 

莫名其妙,但我不能找出如何..

最好wolud是我PLPGSQL功能。

+0

多次嘗試後一種可能的解決> UPDATE測試 SET myArray的= array_append(myarray中, '{FGH,gfdsa}') WHERE ID = XYZ AND timestp =「2010-01-01 10:10 :10「 AND place ='無處' AND NOT EXISTS(SELECT 1 FROM test where'{fgh,gfdsa}'= ANY(myarray))); 這可能有副作用或隱藏的故障。我必須好好測試一下。在更大的DBS中也沒有性能經驗... – ykat

+0

在我看來,好像你想在Postgres中使用SET類型。 [將MySQL SET數據類型轉換爲Postgres](http://stackoverflow.com/questions/8424283/convert-mysql-set-data-type-to-postgres)建議了可以完成的方法並直接應用於您的場景。 –

回答

2
UPDATE test 
    SET myarray = myarray || array['fgh','gfdsa']::varchar[][] 
    WHERE 
     id = 'xyz' 
     AND timestp = '2010-01-01 10:10:10' 
     AND place = 'nowhere' 
     AND not(myarray @> array['fgh','gfdsa']::varchar[][]) 
    ; 
+0

它給了我>「沒有操作符匹配給定的名稱和參數類型」的雙「|」 sign – ykat

+0

@ykat更正 –

+0

完美。感謝answare和編輯。 – ykat

相關問題