PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Parallel unnest () e ordem de classificação no PostgreSQL


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);