Обаждате се на unnest
3 пъти на FROM
клауза, това означава, че правите CROSS JOIN
(декартово произведение) от 3.
Ако използвате PostgreSQL 9.4 или по-нова версия, можете просто да направите едно извикване на unnest
даване на всеки масив като вход:
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)
Друга опция, за всяка версия, е да добавите извикването към unnest
в SELECT
вместо 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
И в двата случая, но особено в последния, трябва да сте сигурни, че всеки масив има точно същия брой елементи. Ако не стане при първия метод, всеки липсващ ред ще бъде попълнен като NULL, но вторият ще върне толкова реда, колкото LCM от броя на редовете, върнати от всеки, което вероятно не искате. Пример:
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)
Проверете документацията за извиквания на таблични функции за повече информация.