给定PostgreSQL 9.6中的此表:
CREATE TABLE test_table ( id int PRIMARY KEY , test_array text[] );
与像这样的行:
INSERT INTO test_table (id, test_array) VALUES (1 , '{A,A,A,B,B,B}');
如何删除一个单一的“ B”值?
我不能使用:
UPDATE test_table SET test_array = array_remove(test_array, 'B') WHERE id = 1;
因为它会删除 所有 值“ B”的元素。我只是想删除一个元素(例如,第一个)。
有任何想法吗?
根据我在dba.SE上找到的旧答案,并充分利用了它:
您可能会更进一步:
CREATE OR REPLACE FUNCTION f_array_remove_elem1(anyarray, anyelement) RETURNS anyarray LANGUAGE sql IMMUTABLE AS 'SELECT $1[:idx-1] || $1[idx+1:] FROM array_position($1, $2) idx';
此函数将要删除的元素的值作为第二个参数。相应地使用多态伪类型anyelement使它适用于任何数组类型。
anyelement
那么UPDATE简单的是:
UPDATE
UPDATE test_table SET test_array = f_array_remove_elem1(test_array, 'B') WHERE id = 1;
db <>在这里拨弄
当使用我的原始函数f_array_remove_elem()获取索引位置而不是元素值时,您可以不使用子查询:
f_array_remove_elem()
UPDATE test_table SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B')) WHERE id = 1;
甚至可能比我的新功能快一点。 并请注意,我的旧答案底部的较简单版本适用于Postgres 9.6。