Come posso ottenere la posizione di un valore negli array PostgreSQL? C'è il metodo .index()
per Python e la funzione array_search()
per PHP, ma non riesco a trovare alcuna funzione di questo tipo per PostgreSQL. Devo scrivere una funzione memorizzata per farlo? Preferisco risolvere usando una funzione integrata.Individuazione della posizione di un valore negli array PostgreSQL
risposta
Since version 9.5, viene costruito in funzioni: array_position()
e array_positions()
, per la ricerca chiave dell'array (solo la prima occorrenza) oi tasti (tutte le occorrenze), per valore.
Queste funzioni supportano il tipo anyarray.
Il documentation recommends utilizza la funzione generate_subscripts
. La funzione di sotto di emulare PHP di array_search
:
CREATE FUNCTION array_search(needle ANYELEMENT, haystack ANYARRAY)
RETURNS INT AS $$
SELECT i
FROM generate_subscripts($2, 1) AS i
WHERE $2[i] = $1
ORDER BY i
$$ LANGUAGE sql STABLE;
Questo restituisce l'indice della prima partita, se presente. Se vuoi tutte le partite, cambia semplicemente RETURNS INT
a RETURNS SETOF INT
. Questa funzione, come è, restituisce NULL
se non viene trovata alcuna corrispondenza.
Questa funzione funziona solo con matrici unidimensionali.
Inoltre, tenere presente che array_search(NULL, a)
restituisce sempre NULL
, anche se l'array contiene elementi null:
> SELECT array_search(null, array[1, 2, null, 4]);
array_search
--------------
(1 row)
Questo perché SQL ritiene NULL = NULL
essere Sconosciuto (cioè NULL
). Vedi functions-comparison. Se si vuole array_search
essere in grado di trovare NULL
elementi, modificare
WHERE $2[i] = $1
a
WHERE $2[i] IS NOT DISTINCT FROM $1
Per gli array di interi solo è possibile utilizzare il notevolmente più veloce idx
function from the intarray
bundled extension.
Questa funzione non è stata generalizzata per supportare tutti i tipi di array ancora, purtroppo, quindi sei bloccato con un approccio SQL molto lento per altri array.
- 1. Individuazione della posizione del mouse relativa a un pannello
- 2. Query sul valore di elementi array (PostgreSQL)
- 3. Come utilizzare SQLAlchemy per selezionare il valore in una posizione in un ARRAY PostgreSQL?
- 4. I NULL occupano spazio negli indici postgresql?
- 5. Lunghezza negli array
- 6. PostgreSQL - impostare un valore di cella di default in base ad un altro valore della cella
- 7. Individuazione della norma StrictMode violata
- 8. PostgreSQL - valore dinamico come nome della tabella
- 9. Posizione file dati PostgreSQL
- 10. individuazione dell'elemento non comune tra due array
- 11. Individuazione della posizione del rettangolo che consente di coprire i punti massimi nello spazio 2D
- 12. Individuazione della separazione Cielo/Terra in OpenCV
- 13. PostgreSQL - determinazione della percentuale di un totale
- 14. Python - Individuazione della posizione di una corrispondenza regolare in una stringa?
- 15. Dare il doppio valore a Geopoint negli overlay di GoogleMap
- 16. Interfacce automatiche implementate negli array
- 17. Inserimento di un array in un database Postgresql in Golang
- 18. Find chiave matrice negli oggetti array dato un valore di attributo
- 19. Parametro di binding come array PostgreSQL
- 20. Copia array di byte negli appunti
- 21. Ricerca di dati sovrapposti negli array
- 22. Individuazione del punto all'interno della geometria
- 23. Individuazione della Posta in arrivo Bluetooth
- 24. Valore colonna di aggiornamento PostgreSQL
- 25. Individuazione dell'aspetto della versione dell'SDK per Android
- 26. Mappare un array PostgreSQL con Hibernate
- 27. Individuazione della dimensione della linea di ogni riga in un file di testo
- 28. Impostazione di un array su un valore
- 29. PostgreSQL unnest con array vuoto
- 30. PostgreSQL: Aggiungi intervallo alla data/ora dal valore della colonna
+1 per generate_subscripts() e una risposta molto completa. –
Bella risposta. Questo diventerà più semplice ed efficiente quando PostgreSQL 9.4 aggiungerà le funzioni 'WITH ORDINAL', permettendoti di scrivere' unnest (the_array) WITH ORDINAL'. Forse dovrei scrivere e inviare una funzione 'idx' corretta per 9.4, sebbene ... –