Подтвердить что ты не робот

Удалить значения массива в pgSQL

Есть ли способ удалить значение из массива в pgSQL? Или, точнее, вывести последнее значение? Судя по этот список, ответ кажется нет. Я могу получить результат, который я хочу, с дополнительным указателем указателя, но это немного громоздко.

4b9b3361

Ответ 1

Нет, я не думаю, что ты можешь. По крайней мере, не запиная что-то уродливое, как:

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

Ответ 2

В версии 9.3 и выше вы можете:

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

Ответ 3

Самый простой способ удалить последнее значение:

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

Ответ 4

Существует ПРОСТОЙ способ удалить значение из массива в PLAIN SQL:

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

он удалит все значения NULL из массива. Результат будет:

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

Ответ 5

Я не уверен в вашем контексте, но это должно дать вам что-то для работы:

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

Ответ 6

Вот функция, которую я использую для целых [] массивов

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}

Ответ 7

Я работаю на 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

Я создал функцию 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$ 

существует также версия gist https://gist.github.com/1392734

Ответ 9

Попробуйте следующее:

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

Ответ 10

Моя функция для всех типов массивов.

Внешняя функция:

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
;