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

Achatando uma relação com um array para emitir uma linha por entrada de array


Podemos colocar a função set-returning unnest() no SELECT liste como Raphaël sugere . Isso costumava exibir problemas de caixa de canto antes do Postgres 10. Veja:

Desde o Postgres 9.3, também podemos usar um LATERAL junte-se a isso. É a maneira mais limpa e compatível com o padrão de colocar funções de retorno de conjunto no FROM lista, não no SELECT Lista:
SELECT name, value
FROM   tbl, unnest(values) value;  -- implicit CROSS JOIN LATERAL

Uma diferença sutil:isso descarta linhas com values vazios / NULL do resultado desde unnest() retorna nenhuma linha , enquanto o mesmo é convertido para um valor NULL no FROM list e retornou de qualquer maneira. A consulta 100% equivalente é:
SELECT t.name, v.value
FROM   tbl t
LEFT   JOIN unnest(t.values) v(value) ON true;

Ver: