C'è un modo per rimuovere un valore da un array in pgSQL? O per essere più precisi, per inserire l'ultimo valore? A giudicare dal this list la risposta sembra essere no. Posso ottenere il risultato desiderato con un puntatore indice aggiuntivo, ma è un po 'macchinoso.Rimuovere i valori dell'array in pgSQL
risposta
No, non penso che tu possa. Almeno non senza scrivere qualcosa di brutto come:
SELECT ARRAY (
SELECT UNNEST(yourarray) LIMIT (
SELECT array_upper(yourarray, 1) - 1
)
)
non sono sicuro circa il vostro contesto, ma questo dovrebbe darvi qualcosa su cui lavorare:
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
Grazie, funzionerebbe anche se immagino che l'affettatura non sia esattamente una soluzione efficiente? – oggy
Penso che sia il metodo migliore considerando che non esiste una funzione incorporata per pop(). Senza conoscere le specifiche, non posso dare un consiglio migliore. Se si desidera eseguire il looping dei contenuti per un particolare record, allora unnest() sarebbe probabilmente migliore in quanto verrebbe convertito in un set di record. Tuttavia, se si desidera aggiornare una tabella per rimuovere tutti gli "ultimi elementi" della matrice in più record, l'allineamento dell'array sarebbe la strada da percorrere. –
ho creato una funzione array_pop così è possibile rimuovere un elemento con valore noto da una matrice.
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$
esiste anche una versione sostanza https://gist.github.com/1392734
Qui è una funzione che uso per interi [] array
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
);
$$;
Questo è ovviamente per le matrici di interi ma potrebbe essere modificato per anyarray anyelement
=> select array_remove_item(array[1,2,3,4,5], 3);
-[ RECORD 1 ]-----+----------
array_remove_item | {1,2,4,5}
C'è un modo semplice per rimuovere un valore da una matrice in PLAIN SQL:
SELECT unnest('{5,NULL,6}'::INT[]) EXCEPT SELECT NULL
rimuoverà tutti i valori NULL dalla matrice. Il risultato sarà:
#| integer |
------------
1| 5 |
2| 6 |
Gli utenti della versione 9.3+ dovrebbero vedere [questa risposta] (http://stackoverflow.com/a/27346920/3159183). Gli utenti della versione 9.2 e seguenti possono concludere il codice sopra per il riutilizzo come questo: http://sqlfiddle.com/#!15/03d32/1/0 – SeldomNeedy
Io corro su 9.2 e sono in grado di eseguire questo:
update tablename set arrcolumn=arrcolumn[1:array_length(arrcolumn)-1];
o si può spostare fuori l'elemento frontale con lo stesso tipo di cosa:
update tablename set arrcolumn=arrcolumn[2:array_length(arrcolumn)];
Attento, programmatori - per qualche motivo ancora sconosciuto alla scienza, gli array pgsql sono 1-indexed invece di 0-indexed.
Prova questo:
update table_name set column_name=column_name[1:array_upper(column_name, 1)-1];
La mia funzione per tutti i tipi di array.
funzione esterno:
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
;
funzione interno:
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
;
Nella versione 9.3 e soprattutto si può fare:
update users set flags = array_remove(flags, 'active')
A partire dal 2015, questa è la risposta più appropriata-- supponendo che tu sia " ri almeno con PostgreSQL 9.3. –
Per quelli di voi che non sono ancora riusciti a passare alla versione 9.3+, dovreste essere in grado di scrivere il vostro 'array_remove()' come mostrato: http://sqlfiddle.com/#!15/03d32/1/0 – SeldomNeedy
Questo è assolutamente ** non ** "la risposta più appropriata", poiché la domanda chiede esplicitamente se siamo in grado di "inserire l'ultimo valore". Anche se dovessi prima eseguire una query sul valore dell'ultimo elemento, se tale valore è stato ripetuto del tutto nella matrice, tutte le ** istanze di essa sarebbero state rimosse. Ovviamente questa non è la funzionalità desiderata di qualcosa come una funzione 'array_pop()', che è ciò che l'OP sta chiedendo. – JMTyler
- 1. rimuovere i valori anomali in bwplot
- 2. Rimuovere i duplicati con meno valori nulli
- 3. Come rimuovere i valori da un QMap?
- 4. Tabella pivot; rimuovere i vecchi valori dall'affettatrice
- 5. Come rimuovere i valori vuoti dall'array multidimensionale in PHP?
- 6. Keras Neural Nets, Come rimuovere i valori NaN in uscita?
- 7. Come rimuovere i valori da un array in PHP?
- 8. Come rimuovere i valori duplicati da un elenco in Groovy
- 9. Rimuovere i valori duplicati di HashMap in Java
- 10. Come rimuovere i valori NA nel vettore in R
- 11. come eseguire lo script pgsql in pgAdmin?
- 12. Iterating over integer [] in PL/pgSQL
- 13. Rimuovere i valori duplicati e sommare i valori delle colonne corrispondenti
- 14. emulazione di substring_index() di MySQL in PGSQL
- 15. PL/pgSQL SELEZIONA in un array
- 16. Che cosa significa %% in PL/pgSQL significa?
- 17. Rimuovere i valori di bassa frequenza da pandas.dataframe
- 18. Come rimuovere i valori vuoti param dalla stringa di query
- 19. Rimuovere i valori nell'elenco separato da virgola dal database
- 20. Algoritmo rapido per calcolare percentili per rimuovere i valori anomali
- 21. confrontare due matrici e rimuovere i valori unici
- 22. PHP - Come confrontare due array e rimuovere i valori duplicati
- 23. Rimuovere i valori anomali dal calcolo del coefficiente di correlazione
- 24. Rimuovere i valori letterali #inst e #uuid nel clojure
- 25. Come rimuovere i valori comuni da due liste di array
- 26. come rimuovere stringhe vuote dall'elenco, quindi rimuovere i valori duplicati da un elenco
- 27. Elixir Rimuovere i duplicati dall'elenco
- 28. PL/pgSQL verifica se esiste una riga
- 29. SQLAlchemy SELECT WITH clausola/istruzione (pgsql)
- 30. Buone risorse per l'apprendimento di PL/pgSQL?
A giudicare da ciò che Google mi dice, sembra che io non si può.Segnalo come risposta accettata a meno che qualcuno non ti dia ragione :) – oggy