代码之家  ›  专栏  ›  技术社区  ›  oggy

删除pgSQL中的数组值

  •  28
  • oggy  · 技术社区  · 16 年前

    有没有办法从pgSQL中的数组中删除值?或者更准确地说,弹出最后一个值?根据 this list 答案似乎是否定的。我可以用一个额外的索引指针得到我想要的结果,但这有点麻烦。

    10 回复  |  直到 16 年前
        1
  •  12
  •   Magnus Hagander    16 年前

    不,我想你不行。至少在没有写下一些丑陋的东西之前是这样的:

    SELECT ARRAY (
     SELECT UNNEST(yourarray) LIMIT (
      SELECT array_upper(yourarray, 1) - 1
     )
    )
    
        2
  •  109
  •   John Sheehan    11 年前

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

    update users set flags = array_remove(flags, 'active')
    
        3
  •  27
  •   Erwin Brandstetter    12 年前

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

    array1 = array[1,2,3]
    array1 = ( select array1[1:array_upper(array1, 1) - 1] )
    
        4
  •  10
  •   Matthew Wood    16 年前

    我不确定你的背景,但这应该会给你一些东西:

    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
  •  10
  •   user2210877    13 年前

    在纯SQL中,有一种从数组中删除值的简单方法:

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

    #| integer |
    ------------
    1|    5    |
    2|    6    |
    
        6
  •  5
  •   Dustin Butler    13 年前

    下面是一个用于整数[]数组的函数

    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
    );
    $$;
    

    => select array_remove_item(array[1,2,3,4,5], 3);
    -[ RECORD 1 ]-----+----------
    array_remove_item | {1,2,4,5}
    
        7
  •  3
  •   amwinter    12 年前

    我正在运行9.2,我能够执行以下操作:

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

    或者,您也可以使用相同的东西将前元素移开:

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

    请小心,程序员们——出于科学上未知的原因,pgsql数组是1索引的,而不是0索引的。

        8
  •  2
  •   number5    14 年前

    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

        9
  •  1
  •   Karim Tabet    12 年前

    update table_name set column_name=column_name[1:array_upper(column_name, 1)-1];
    
        10
  •  -1
  •   Roman V. NIkolaev    12 年前

    我的函数适用于所有类型的数组。

    外部功能:

    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
    ;