Sim, esse é um recurso do Postgres e o desaninhamento paralelo é garantido estar em sincronia (desde que todos os arrays tenham o mesmo número de elementos).
O Postgres 9.4 adiciona uma solução limpa para desaninhamento paralelo:
- Desaninhar vários arrays em paralelo
A ordem das linhas resultantes não é garantida, no entanto. Na verdade, com uma declaração tão simples como:
SELECT unnest(ARRAY[5,3,9]) AS id
a ordem resultante das linhas é "garantida", mas o Postgres não afirma nada. O otimizador de consulta é livre para ordenar as linhas como achar melhor, desde que a ordem não seja definida explicitamente. Isso pode ter efeitos colaterais em consultas mais complexas.
Se a segunda consulta em sua pergunta for o que você realmente deseja (adicione um número de índice a elementos de matriz não aninhados), há uma maneira melhor com generate_subscripts() :
SELECT unnest(ARRAY[5,3,9]) AS id
, generate_subscripts(ARRAY[5,3,9], 1) AS idx
ORDER BY idx;
Detalhes nesta resposta relacionada:
- Como acessar o índice interno do array com o postgreSQL?
Você estará interessado em
WITH ORDINALITY
no Postgres 9.4 :- PostgreSQL unnest() com número do elemento
Então você pode usar:
SELECT * FROM unnest(ARRAY[5,3,9]) WITH ORDINALITY tbl(id, idx);