Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция UNNEST / 19 сообщений из 19, страница 1 из 1
22.08.2014, 12:17:54
    #38726494
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
Скажите пожалуйста, есть ли гарантия соответствия в результирующей выборке между одними и теми же индексами различных массив при выполнении функции unnest, например есть

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



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

Версия postgresql 8.4
...
Рейтинг: 0 / 0
22.08.2014, 12:31:40
    #38726520
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
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
22.08.2014, 12:58:13
    #38726563
Функция UNNEST
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
22.08.2014, 13:05:04
    #38726581
buddy_ekb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
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
22.08.2014, 13:15:02
    #38726604
Функция UNNEST
йокарный бабай<>
а это разве не декарт ?
или в 8.4 у них ещё в головках не прояcнело, что это скрытый lateral ?
<>
таки не декарт
по крайней мере до 9.1. включительно
будем знать

мелкие , никчёмные люди эти ..., слюшай
ну просто законченные, неприкрытые олбаобы
...
Рейтинг: 0 / 0
22.08.2014, 13:24:56
    #38726618
Функция UNNEST
бгг. там целая теория чисел и сравнимости по модулю:
Код: 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
22.08.2014, 13:30:59
    #38726633
Функция UNNEST
йокарный бабайбгг. там целая теория чисел и сравнимости по модулю:
Код: 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
22.08.2014, 13:38:56
    #38726647
Функция UNNEST
йокарный бабай,
и вообще, надо запомнить эту , кхм, "фичу" хорошенько, и никогда не вставлять более одной 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
22.08.2014, 14:51:28
    #38726761
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
Maxim Boguk а зачем вам такоге надо?

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

Спасибо всем.
...
Рейтинг: 0 / 0
22.08.2014, 17:39:49
    #38727011
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
йокарный бабаййокарный бабай,
и вообще, надо запомнить эту , кхм, "фичу" хорошенько, и никогда не вставлять более одной 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
22.08.2014, 20:08:53
    #38727102
Функция UNNEST
Maxim Boguk,
а, прстите за нескромный, афтар у сей фичи имеется ?
чей это кг/ам ?
страна должна знать своих героев
или и тут во всём индусы вино ваты ?
...
Рейтинг: 0 / 0
22.08.2014, 20:10:51
    #38727103
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
Maxim Bogukфича известна, описана в документации, и отмечена что вообще поведение неспецифицированно и что так делать не надо.
А ткните, пожалуйста, в документацию линком. Я не смог найти в текущей версии описания этой фичи.
...
Рейтинг: 0 / 0
22.08.2014, 20:48:50
    #38727123
Функция UNNEST
vyegorovMaxim Bogukфича известна, описана в документации, и отмечена что вообще поведение неспецифицированно и что так делать не надо.
А ткните, пожалуйста, в документацию линком. Я не смог найти в текущей версии описания этой фичи.я вот знаю, когда это (для равных array-ев) практично.

но запороть из-за одиночной практичности целую ветку напрашивающегося синтакса [однопольных lateral] -- это не по хозяйски. за такое вешать надо на воротах. Можно, конечно, ввести дополнительные модификаторы (типа ~CORRELATED~) для отличия нормального поведения (декарт) от почленно--коррелированного-по-модулю-наименьшего-сета [причем даже и для некратных сетов можно что-то эдакое понапридумать, отличное от декарта, и полезное в хозяйстве]. Это будет типа ""ара-кал" вей". По 100 дополнительных слов в случайных местах вместо синтаксической стройности.
...
Рейтинг: 0 / 0
23.08.2014, 04:52:42
    #38727189
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
йокарный бабай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
24.09.2014, 14:14:33
    #38756190
Gold_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
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
24.09.2014, 14:35:11
    #38756212
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
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
24.09.2014, 14:41:58
    #38756219
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
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
24.09.2014, 14:43:43
    #38756221
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
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
24.09.2014, 16:09:32
    #38756370
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция UNNEST
Начиная с 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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция UNNEST / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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