4

可能重复:
将 MySQL SET 数据类型转换为 Postgres

我有postgresql 8.4。

我正在尝试建立一个查询但没有成功。如果相关行中不存在元素,我想将元素插入到数组中。

表“测试”:

+------------------+------------------+
| 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='xyz' AND timestp="2010-01-01 10:10:10" AND place='nowhere')如果它还没有在数组

我试过这样的>

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[]) 

不知何故,但我不知道如何..

对我来说最好的方法是一个 plpgsql 函数。

4

1 回答 1

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[][])
    ;
于 2012-12-22T18:30:17.177 回答