recorrer llenar into example arreglos array_agg array arrays postgresql

arrays - llenar - recorrer array postgresql



Eliminar valores de matriz en pgSQL (10)

¿Hay una manera de eliminar un valor de una matriz en pgSQL? ¿O para ser más precisos, para sacar el último valor? A juzgar por esta lista, la respuesta parece ser no. Puedo obtener el resultado que quiero con un puntero de índice adicional, pero es un poco engorroso.


Aquí hay una función que utilizo para arrays de enteros []

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

Esto es obviamente para matrices de enteros, pero podría modificarse para ANYARRAY ANYELEMENT

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


En la versión 9.3 y superiores puedes hacer:

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


Estoy corriendo en 9.2 y soy capaz de ejecutar esto:

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

o puedes cambiar el elemento frontal con el mismo tipo de cosas:

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

Con cuidado, programadores: por alguna razón aún desconocida para la ciencia, los arreglos pgsql tienen un índice de 1 en lugar de un índice de 0.


Existe una forma sencilla de eliminar un valor de una matriz en PLAIN SQL:

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

eliminará todos los valores NULL de la matriz. El resultado será:

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


He creado una función array_pop para que pueda eliminar un elemento con un valor conocido de una matriz.

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$

También hay una versión esencial https://gist.github.com/1392734


La forma más sencilla de eliminar el último valor:

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


Mi función para todo tipo de matrices.

Función externa:

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 ;

Función interna:

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 ;


No estoy seguro de tu contexto, pero esto debería darte algo con lo que trabajar:

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


No, no creo que puedas. Al menos no sin escribir algo feo como:

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


Prueba esto:

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