PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Parallel unnest() e ordinamento in PostgreSQL

Sì, questa è una caratteristica di Postgres e l'annullamento dell'annidamento parallelo è garantito essere sincronizzati (purché tutti gli array abbiano lo stesso numero di elementi).
Postgres 9.4 aggiunge una soluzione pulita per il disannidamento parallelo:

  • Disnida più array in parallelo

Tuttavia, l'ordine delle righe risultanti non è garantito. In realtà, con una dichiarazione semplice come:

SELECT unnest(ARRAY[5,3,9]) AS id

l'ordine delle righe risultante è "garantito", ma Postgres non afferma nulla. Query Optimizer è libero di ordinare le righe come meglio crede, purché l'ordine non sia definito in modo esplicito. Ciò potrebbe avere effetti collaterali nelle query più complesse.

Se la seconda query nella tua domanda è ciò che desideri effettivamente (aggiungi un numero di indice agli elementi dell'array non nidificati), c'è un modo migliore con generate_subscripts() :

SELECT unnest(ARRAY[5,3,9]) AS id
     , generate_subscripts(ARRAY[5,3,9], 1) AS idx
ORDER  BY idx;

Dettagli in questa risposta correlata:

  • Come accedere all'indice interno dell'array con postgreSQL?

Sarai interessato a WITH ORDINALITY in Postgres 9.4 :

  • PostgreSQL unnest() con numero elemento

Quindi puoi usare:

SELECT * FROM unnest(ARRAY[5,3,9]) WITH ORDINALITY tbl(id, idx);