powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция UNNEST
19 сообщений из 19, страница 1 из 1
Функция UNNEST
    #38726494
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите пожалуйста, есть ли гарантия соответствия в результирующей выборке между одними и теми же индексами различных массив при выполнении функции unnest, например есть

Код: sql
1.
select unnest(ARRAY[1,2,3]), unnest(ARRAY[5,6,7])



В результате должны получить набор строк из двух полей, где в одной строке должен быть первый элемент первого массива и первый элемент второго массива, в следующей строке 2 элемент 1 массива и 2 элемент 2 массива и т.д.
Массивы всегда имеют одинаковую размерность.

Версия postgresql 8.4
...
Рейтинг: 0 / 0
Функция UNNEST
    #38726520
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotСкажите пожалуйста, есть ли гарантия соответствия в результирующей выборке между одними и теми же индексами различных массив при выполнении функции unnest, например есть

Код: sql
1.
select unnest(ARRAY[1,2,3]), unnest(ARRAY[5,6,7])



В результате должны получить набор строк из двух полей, где в одной строке должен быть первый элемент первого массива и первый элемент второго массива, в следующей строке 2 элемент 1 массива и 2 элемент 2 массива и т.д.
Массивы всегда имеют одинаковую размерность.

Версия postgresql 8.4

практически именно на версии 8.4 есть
теоретически же - поведение в общем случае неспецифицированно...

а зачем вам такоге надо?

сделайте себе
Код: plaintext
1.
2.
3.
4.
5.
6.
values (1,4),(2,5),(3,6);
 column1 | column2
---------+---------
       1 |       4
       2 |       5
       3 |       6

и наслаждайтесь гарантированный поведением...
...
Рейтинг: 0 / 0
Функция UNNEST
    #38726563
Maxim Boguk <>
практически именно на версии 8.4 есть
<> а это разве не декарт ?
или в 8.4 у них ещё в головках не прояcнело, что это скрытый lateral ?


2TS
в 8.4 row_number() отсутствует (обычно через него проще). поэтому через generate_series(1,GREATEST(array_length(array1,1),array_length(array2,1)) i

примерно так (не тестил):
Код: sql
1.
2.
3.
SELECT array1[i],array2[i] 
FROM 
  generate_series(1,GREATEST(array_length(array1,1),array_length(array2,1)) i
...
Рейтинг: 0 / 0
Функция UNNEST
    #38726581
buddy_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
big-trot,

на случай будущего апгрейда можно извернуться вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with
  a1(a1) as (select array[1, 3, 5, 100])
, a2(a2) as (select array[2, 4, 6, 8, 200, 300])
select i, a1[i], a2[i]
from (select generate_subscripts(a1, 1) i from a1) gs
    , a1
    , a2;



или глянуть сюда:
http://stackoverflow.com/questions/8760419/postgresql-unnest-with-element-number
...
Рейтинг: 0 / 0
Функция UNNEST
    #38726604
йокарный бабай<>
а это разве не декарт ?
или в 8.4 у них ещё в головках не прояcнело, что это скрытый lateral ?
<>
таки не декарт
по крайней мере до 9.1. включительно
будем знать

мелкие , никчёмные люди эти ..., слюшай
ну просто законченные, неприкрытые олбаобы
...
Рейтинг: 0 / 0
Функция UNNEST
    #38726618
бгг. там целая теория чисел и сравнимости по модулю:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9]) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9]) u2;


select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9]) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9]) u2;



select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9,0]) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9,0]) u2;



бугага, просто уссацца

мелкие , никчёмные люди эти ..., слюшай
ну просто законченные, неприкрытые, сертифицированные оп.здолы
...
Рейтинг: 0 / 0
Функция UNNEST
    #38726633
йокарный бабайбгг. там целая теория чисел и сравнимости по модулю:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7]) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7]) u2;


select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9]) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9]) u2;



select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9,0]) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, unnest(ARRAY[5,6,7,8,9,0]) u2;



бугага, просто уссацца

мелкие , никчёмные люди эти ..., слюшай
ну просто законченные, неприкрытые, сертифицированные оп.здолы
...
Рейтинг: 0 / 0
Функция UNNEST
    #38726647
йокарный бабай,
и вообще, надо запомнить эту , кхм, "фичу" хорошенько, и никогда не вставлять более одной set-returning в select лист, если от него хочется честного квази-lateral с декартом


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,3) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,3) u2;



select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,5) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,5) u2;


select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,6) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,6) u2;


select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,7) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,7) u2;



select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,9) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,9) u2;



select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,11) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,11) u2;
...
Рейтинг: 0 / 0
Функция UNNEST
    #38726761
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk а зачем вам такоге надо?

В таблице pg_constraint есть два поля conkey и confkey. Между этими массивами установлена однозначная связь, т.е. первый элемент одного массива соответствует первому элементу другого массива. Отсюда и возникла эта задача.

Спасибо всем.
...
Рейтинг: 0 / 0
Функция UNNEST
    #38727011
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
йокарный бабаййокарный бабай,
и вообще, надо запомнить эту , кхм, "фичу" хорошенько, и никогда не вставлять более одной set-returning в select лист, если от него хочется честного квази-lateral с декартом


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,3) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,3) u2;



select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,5) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,5) u2;


select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,6) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,6) u2;


select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,7) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,7) u2;



select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,9) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,9) u2;



select u1, u2 FROM unnest(ARRAY[1,2,3]) u1, generate_series(1,11) u2
EXCEPT 
select unnest(ARRAY[1,2,3]) u1, generate_series(1,11) u2;



фича известна, описана в документации, и отмечена что вообще поведение неспецифицированно и что так делать не надо.
именно по этому я написал что в общем случае поведение неспецифицированно и с какой то из версий несколько SRF в result list будет просто запрещено использовать...
...
Рейтинг: 0 / 0
Функция UNNEST
    #38727102
Maxim Boguk,
а, прстите за нескромный, афтар у сей фичи имеется ?
чей это кг/ам ?
страна должна знать своих героев
или и тут во всём индусы вино ваты ?
...
Рейтинг: 0 / 0
Функция UNNEST
    #38727103
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukфича известна, описана в документации, и отмечена что вообще поведение неспецифицированно и что так делать не надо.
А ткните, пожалуйста, в документацию линком. Я не смог найти в текущей версии описания этой фичи.
...
Рейтинг: 0 / 0
Функция UNNEST
    #38727123
vyegorovMaxim Bogukфича известна, описана в документации, и отмечена что вообще поведение неспецифицированно и что так делать не надо.
А ткните, пожалуйста, в документацию линком. Я не смог найти в текущей версии описания этой фичи.я вот знаю, когда это (для равных array-ев) практично.

но запороть из-за одиночной практичности целую ветку напрашивающегося синтакса [однопольных lateral] -- это не по хозяйски. за такое вешать надо на воротах. Можно, конечно, ввести дополнительные модификаторы (типа ~CORRELATED~) для отличия нормального поведения (декарт) от почленно--коррелированного-по-модулю-наименьшего-сета [причем даже и для некратных сетов можно что-то эдакое понапридумать, отличное от декарта, и полезное в хозяйстве]. Это будет типа ""ара-кал" вей". По 100 дополнительных слов в случайных местах вместо синтаксической стройности.
...
Рейтинг: 0 / 0
Функция UNNEST
    #38727189
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
йокарный бабайMaxim Boguk,
а, прстите за нескромный, афтар у сей фичи имеется ?
чей это кг/ам ?
страна должна знать своих героев
или и тут во всём индусы вино ваты ?

эта баго-фича была унаследована в каком то виде PostgreSQL от BerkelyDB лет 30 назад (по слухам).
С тех пор и мучаемся :).
Вот вам например обсуждение 6 летней давности:
http://www.postgresql.org/message-id/flat/e431ff4c0803190503m49eeef76pb91a692009a30331@mail.gmail.com]http://www.postgresql.org/message-id/flat/e431ff4c0803190503m49eeef76pb91a692009a30331@mail.gmail.com
(ключевое там последнее письмо).

Эту тему я в рассылках вижу 1-2 раза в год вылезающую уже лет 10 минимум.
...
Рейтинг: 0 / 0
Функция UNNEST
    #38756190
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
Доброго времени суток.
Что посоветуете, если мы активно используем массивы с одинаковой размерностью, рассчитывая, что unnest() вернет результат поэлементно?
PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit

Спасибо.
...
Рейтинг: 0 / 0
Функция UNNEST
    #38756212
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_Maxim Boguk,
Доброго времени суток.
Что посоветуете, если мы активно используем массивы с одинаковой размерностью, рассчитывая, что unnest() вернет результат поэлементно?
PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit

Спасибо.

до версий 9.4 включительно - можно считать что гарантированно...
на будущее... hm... я бы что то вроде вышеупомянутого
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with
  a1(a1) as (select array[1, 3, 5, 100])
, a2(a2) as (select array[2, 4, 6, 8])

select i, a1[i], a2[i]
from (select generate_subscripts(a1, 1) i from a1) gs
    , a1
    , a2;



использовал бы.

Но вообще надо конкретный запрос смотреть конечно.
...
Рейтинг: 0 / 0
Функция UNNEST
    #38756219
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Или (что после 5 минут раздумий мне понравилось больше - использовать row_number()):

Код: plsql
1.
2.
3.
select t1.val, t2.val
from (select val,row_number() over () as row_num from unnest(array[1, 3, 5, 7]) as u(val)) as t1
join (select val,row_number() over () as row_num from unnest(array[2, 6, 10, 14]) as u(val)) as t2 on t1.row_num=t2.row_num;
...
Рейтинг: 0 / 0
Функция UNNEST
    #38756221
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukMaxim Boguk,

Или (что после 5 минут раздумий мне понравилось больше - использовать row_number()):

Код: plsql
1.
2.
3.
select t1.val, t2.val
from (select val,row_number() over () as row_num from unnest(array[1, 3, 5, 7]) as u(val)) as t1
join (select val,row_number() over () as row_num from unnest(array[2, 6, 10, 14]) as u(val)) as t2 on t1.row_num=t2.row_num;



вообще все зависит от размера массивов...
для длинных (100 и больше) первый вариант быстрее
для коротких - 10 и меньше второй
...
Рейтинг: 0 / 0
Функция UNNEST
    #38756370
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начиная с 9.4 для явной нумерации строк можно делать так:
Код: sql
1.
SELECT * FROM unnest(ARRAY['a','b','c','d','e','f']) WITH ORDINALITY s(a,o);


Также добавлена конструкция `ROWS FROM ()`, которая получает набор функций на вход, и выдает (построчно) значения первого ряда, второго ряда и т.д. (т.е. первые результаты в выводе функций формируют первую строку результата), выводя NULL для недостающих элементов.
Код: sql
1.
SELECT * FROM ROWS FROM (unnest(array[1,2]),unnest(array[3,4,5]));


В случае же unnest(), то она была перегружена версией принимающей N массивов и ведущей себя также как и `ROWS FROM()` конструкция. Такую функцию можно использовать только во FROM-списке.
Код: sql
1.
2.
SELECT * FROM unnest(array[1,2],array[3,4,5]);
SELECT * FROM unnest(array[1,2],array[3,4,5]) WITH ORDINALITY;


Описано тут (вниз до function_name ), чуть подробнее у depesz'а и у Michael Paquier'а .

Скорость я не смотрел :(
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция UNNEST
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]