删除pgSQL中的数组值

时间:2010-01-15 15:42:15

标签: arrays postgresql

有没有办法从pgSQL中删除数组中的值?或者更准确地说,弹出最后一个值?从this list来看,答案似乎是否定的。

,我可以使用额外的索引指针获得我想要的结果,但这有点麻烦。

10 个答案:

答案 0 :(得分:76)

在版本9.3及更高版本中,您可以执行以下操作:

update users set flags = array_remove(flags, 'active')

答案 1 :(得分:19)

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

array1 = array[1,2,3]
array1 = ( select array1[1:array_upper(array1, 1) - 1] )

答案 2 :(得分:10)

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

SELECT ARRAY (
 SELECT UNNEST(yourarray) LIMIT (
  SELECT array_upper(yourarray, 1) - 1
 )
)

答案 3 :(得分:9)

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

SELECT unnest('{5,NULL,6}'::INT[]) EXCEPT SELECT NULL

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

#| integer |
------------
1|    5    |
2|    6    |

答案 4 :(得分:8)

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

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

答案 5 :(得分: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
);
$$;

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

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

答案 6 :(得分:3)

我在9.2上运行,我可以执行此操作:

update tablename set arrcolumn=arrcolumn[1:array_length(arrcolumn)-1];

或者你可以用同样的东西移开前面的元素:

update tablename set arrcolumn=arrcolumn[2:array_length(arrcolumn)];

细心的程序员 - 由于某些原因,科学仍然不知道,pgsql数组是1索引而不是0索引。

答案 7 :(得分:2)

我已经创建了一个array_pop函数,因此您可以从数组中删除具有已知值的元素。

CREATE OR REPLACE FUNCTION array_pop(a anyarray, element character varying)
RETURNS anyarray
LANGUAGE plpgsql
AS $function$
DECLARE 
    result a%TYPE;
BEGIN
SELECT ARRAY(
    SELECT b.e FROM (SELECT unnest(a)) AS b(e) WHERE b.e <> element) INTO result;
RETURN result;
END;
$function$ 

还有一个要点https://gist.github.com/1392734

答案 8 :(得分:1)

试试这个:

update table_name set column_name=column_name[1:array_upper(column_name, 1)-1];

答案 9 :(得分:-1)

我的所有类型数组的功能。

外部功能:

CREATE OR REPLACE FUNCTION "outer_array"(anyarray, anyarray) RETURNS anyarray AS $$
    SELECT
        "new"."item"
    FROM (
        SELECT
            ARRAY(
                SELECT
                    "arr"."value"
                FROM (
                    SELECT
                        generate_series(1, array_length($1, 1)) AS "i",
                        unnest($1)                              AS "value"
                ) "arr"
                WHERE
                    "arr"."value" <> ALL ($2)
                ORDER BY
                    "arr"."i"
            ) AS "item"
    ) "new"
    $$
LANGUAGE sql
IMMUTABLE
RETURNS NULL ON NULL INPUT
;

内在功能:

CREATE OR REPLACE FUNCTION "inner_array"(anyarray, anyarray) RETURNS anyarray AS $$
    SELECT
        "new"."item"
    FROM (
        SELECT
            ARRAY(
                SELECT
                    "arr"."value"
                FROM (
                    SELECT
                        generate_series(1, array_length($1, 1)) AS "i",
                        unnest($1)                              AS "value"
                ) "arr"
                WHERE
                    "arr"."value" = ANY ($2)
                ORDER BY
                    "arr"."i"
            ) AS "item"
    ) "new"
$$
LANGUAGE sql
IMMUTABLE
RETURNS NULL ON NULL INPUT
;