删除pgSQL中的数组值

ogg*_*ggy 29 arrays postgresql

有没有办法从pgSQL中的数组中删除一个值?或者更准确地说,弹出最后一个值?从这个列表来看,答案似乎是否定的.我可以使用额外的索引指针获得我想要的结果,但它有点麻烦.

Joh*_*han 78

在9.3及以上版本中,您可以:

update users set flags = array_remove(flags, 'active')
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是**不是**“最合适的答案”,因为问题明确询问我们是否能够“弹出最后一个值”。即使您首先查询最后一个元素的值,如果该值在数组中完全重复,**所有** 实例将被删除。这显然不是像 `array_pop()` 函数那样想要的功能,而这正是 OP 所要求的。 (4认同)

小智 20

删除最后一个值的最简单方法:

array1 = array[1,2,3]
array1 = ( select array1[1:array_upper(array1, 1) - 1] )
Run Code Online (Sandbox Code Playgroud)


Mag*_*der 10

不,我认为你不能.至少不是没有写出像丑陋的东西:

SELECT ARRAY (
 SELECT UNNEST(yourarray) LIMIT (
  SELECT array_upper(yourarray, 1) - 1
 )
)
Run Code Online (Sandbox Code Playgroud)


Mat*_*ood 9

我不确定你的背景,但这应该给你一些工作:

CREATE TABLE test (x INT[]);
INSERT INTO test VALUES ('{1,2,3,4,5}');

SELECT x AS array_pre_pop,
       x[array_lower(x,1) : array_upper(x,1)-1] AS array_post_pop, 
       x[array_upper(x,1)] AS popped_value 
FROM test;


 array_pre_pop | array_post_pop | popped_value 
---------------+----------------+--------------
 {1,2,3,4,5}   | {1,2,3,4}      |            5
Run Code Online (Sandbox Code Playgroud)


小智 9

有一种简单的方法可以从PLAIN SQL中删除数组中的值:

SELECT unnest('{5,NULL,6}'::INT[]) EXCEPT SELECT NULL
Run Code Online (Sandbox Code Playgroud)

它将从数组中删除所有NULL值.结果将是:

#| integer |
------------
1|    5    |
2|    6    |
Run Code Online (Sandbox Code Playgroud)


Dus*_*ler 5

这是我用于整数[]数组的函数

CREATE OR REPLACE FUNCTION array_remove_item (array_in INTEGER[], item INTEGER)
RETURNS INTEGER[]
LANGUAGE SQL
AS $$
SELECT ARRAY(
  SELECT DISTINCT $1[s.i] AS "foo"
    FROM GENERATE_SERIES(ARRAY_LOWER($1,1), ARRAY_UPPER($1,1)) AS s(i)
   WHERE $2 != $1[s.i]
   ORDER BY foo
);
$$;
Run Code Online (Sandbox Code Playgroud)

这显然适用于整数数组,但可以针对ANYARRAY ANYELEMENT进行修改

=> select array_remove_item(array[1,2,3,4,5], 3);
-[ RECORD 1 ]-----+----------
array_remove_item | {1,2,4,5}
Run Code Online (Sandbox Code Playgroud)