Você está chamando
unnest
3 vezes em FROM
cláusula, isso significa que você está fazendo um CROSS JOIN
(produto cartesiano) do 3. Se você estiver no PostgreSQL 9.4 ou superior, você pode simplesmente fazer uma chamada de
unnest
dando cada array como entrada:select * from
unnest(
array['2001622', '2001624', '2007903'],
array[15,14,8],
array['type1', 'type1', 'type1'],
array[false, true, true]
) as u(id, ver, type, enabled)
Outra opção, para qualquer versão, é adicionar a chamada a
unnest
em SELECT
em vez de FROM
:select
unnest(array['2001622', '2001624', '2007903']) as id,
unnest(array[15,14,8]) as ver,
unnest(array['type1', 'type1', 'type1']) as type,
unnest(array[false, true, true]) as enabled
Em ambos os casos, mas especialmente no último, você deve ter certeza de que cada array tem exatamente o mesmo número de elementos. Se isso não acontecer no primeiro método, cada linha ausente será preenchida como NULL, mas na segunda retornará tantas linhas quanto LCM do número de linhas retornadas por cada um, o que você provavelmente não deseja. Exemplo:
SELECT * FROM unnest(array[1,2,3,4], array['a','b','c','d','e','f']);
unnest | unnest
--------+--------
1 | a
2 | b
3 | c
4 | d
[null] | e
[null] | f
(6 rows)
SELECT unnest(array[1,2,3,4]), unnest(array['a','b','c','d','e','f']);
unnest | unnest
--------+--------
1 | a
2 | b
3 | c
4 | d
1 | e
2 | f
3 | a
4 | b
1 | c
2 | d
3 | e
4 | f
(12 rows)
Verifique a documentação sobre chamadas de funções de tabela Para maiores informações.