Есть ли способ удалить значение из массива в pgSQL? Или, точнее, вывести последнее значение? Судя по этот список, ответ кажется нет. Я могу получить результат, который я хочу, с дополнительным указателем указателя, но это немного громоздко.
Удалить значения массива в pgSQL
Ответ 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
;