sql >> Base de Datos >  >> RDS >> PostgreSQL

Unnest () paralelo y orden de clasificación en PostgreSQL

Sí, esa es una característica de Postgres y el anidamiento en paralelo está garantizado estar sincronizados (siempre que todas las matrices tengan la misma cantidad de elementos).
Postgres 9.4 agrega una solución limpia para la anulación paralela:

  • Desanime varios arreglos en paralelo

Sin embargo, el orden de las filas resultantes no está garantizado. En realidad, con una declaración tan simple como:

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

el orden resultante de las filas está "garantizado", pero Postgres no afirma nada. El optimizador de consultas es libre de ordenar las filas como mejor le parezca, siempre que el orden no esté definido explícitamente. Esto puede tener efectos secundarios en consultas más complejas.

Si la segunda consulta en su pregunta es lo que realmente desea (agregue un número de índice a los elementos de matriz no anidados), hay una mejor manera con generate_subscripts() :

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

Detalles en esta respuesta relacionada:

  • ¿Cómo acceder al índice interno de la matriz con postgreSQL?

Te interesará WITH ORDINALITY en Postgres 9.4 :

  • PostgreSQL unnest() con número de elemento

Entonces puedes usar:

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