Select по двум массивам

Lists: pgsql-ru-general
From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Select по двум массивам
Date: 2012-12-02 12:52:25
Message-ID: 20121202125225.GA28032@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

есть табличка

1, {1,2,3},{4,6,7},'text1'
2, {8,9,0},{11,23,22},'text2'

нужно сделать выбрку

1,1,4,'text1'
1,2,6,'text1'
1,3,7,'text1'
2,8,11,'text2'
2,9,23,'text2'
2,0,22,'text2'

select col1, unnest(col2), unnest(col3), col4 from table делает в
принципе то что надо, но непонятно будет ли работать это в последующих
версиях Pg :)

--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: Dmitriy Igrishin <dmitigr(at)gmail(dot)com>
To: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: [pgsql-ru-general] Select по двум массивам
Date: 2012-12-04 18:13:02
Message-ID: CAAfz9KMMRd2kLdGED5ucTnCUNfoXw9C28N=CS-SPGf39E5W1=w@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

2 декабря 2012 г., 16:52 пользователь Dmitry E. Oboukhov
<unera(at)debian(dot)org>написал:

> есть табличка
>
> 1, {1,2,3},{4,6,7},'text1'
> 2, {8,9,0},{11,23,22},'text2'
>
> нужно сделать выбрку
>
> 1,1,4,'text1'
> 1,2,6,'text1'
> 1,3,7,'text1'
> 2,8,11,'text2'
> 2,9,23,'text2'
> 2,0,22,'text2'
>
> select col1, unnest(col2), unnest(col3), col4 from table делает в
> принципе то что надо, но непонятно будет ли работать это в последующих
> версиях Pg :)
>
Вообще говоря, такой уверенности быть не может, поскольку никакой
развивающийся софт, в принципе, не стоит на месте. Но учитывая гонку
разработчиков Postgres за обратной совместимостью, скорее всего, данное
поведение будет сохранятся неопределённо долго :-).
Единственно, я бы рекомендовал добавить ORDER BY 1 в запрос.

--
// Dmitriy.


From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: Re: [pgsql-ru-general] Select по двум массивам
Date: 2012-12-04 19:51:32
Message-ID: 20121204195131.GA15663@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

> 2 декабря 2012 г., 16:52 пользователь Dmitry E. Oboukhov <unera(at)debian(dot)org>
> написал:

> есть табличка

> 1, {1,2,3},{4,6,7},'text1'
> 2, {8,9,0},{11,23,22},'text2'

> нужно сделать выбрку

> 1,1,4,'text1'
> 1,2,6,'text1'
> 1,3,7,'text1'
> 2,8,11,'text2'
> 2,9,23,'text2'
> 2,0,22,'text2'

> select col1, unnest(col2), unnest(col3), col4 from table делает в
> принципе то что надо, но непонятно будет ли работать это в последующих
> версиях Pg :)

> Вообще говоря, такой уверенности быть не может, поскольку никакой
> развивающийся софт, в принципе, не стоит на месте. Но учитывая гонку
> разработчиков Postgres за обратной совместимостью, скорее всего, данное
> поведение будет сохранятся неопределённо долго :-).
> Единственно, я бы рекомендовал добавить ORDER BY 1 в запрос.

вопрос не в order by, а в том что такое поведение unnest я нашел
экспериментально и в документации об этом поведении ничего не нашел.
и вот это и смущает
--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: Dmitriy Igrishin <dmitigr(at)gmail(dot)com>
To: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Select по двум массивам
Date: 2012-12-05 21:14:25
Message-ID: CAAfz9KNaUfC5oCMc69eAuo3NbCeQrrXD7xFSNg_jcqvctdmrLw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

4 декабря 2012 г., 23:51 пользователь Dmitry E. Oboukhov
<unera(at)debian(dot)org>написал:

> > 2 декабря 2012 г., 16:52 пользователь Dmitry E. Oboukhov <
> unera(at)debian(dot)org>
> > написал:
>
> > есть табличка
>
> > 1, {1,2,3},{4,6,7},'text1'
> > 2, {8,9,0},{11,23,22},'text2'
>
> > нужно сделать выбрку
>
> > 1,1,4,'text1'
> > 1,2,6,'text1'
> > 1,3,7,'text1'
> > 2,8,11,'text2'
> > 2,9,23,'text2'
> > 2,0,22,'text2'
>
> > select col1, unnest(col2), unnest(col3), col4 from table делает в
> > принципе то что надо, но непонятно будет ли работать это в последующих
> > версиях Pg :)
>
> > Вообще говоря, такой уверенности быть не может, поскольку никакой
> > развивающийся софт, в принципе, не стоит на месте. Но учитывая гонку
> > разработчиков Postgres за обратной совместимостью, скорее всего, данное
> > поведение будет сохранятся неопределённо долго :-).
> > Единственно, я бы рекомендовал добавить ORDER BY 1 в запрос.
>
> вопрос не в order by, а в том что такое поведение unnest я нашел
> экспериментально и в документации об этом поведении ничего не нашел.
> и вот это и смущает
>
Плохо ищете.
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTIONS-RETURNING-SET
Цитирую:
Currently, functions returning sets can also be called in the select list
of a query.
For each row that the query generates by itself, the function returning set
is invoked,
and an output row is generated for each element of the function's result
set. Note,
however, that this capability is deprecated and might be removed in future
releases.

Так что меня ничего здесь не смущает, кроме как отсутствие гарантии
сохранения
порядка, которую можно получить только с помощью ORDER BY.
unnest() просто, цитирую документацию "expand an array to a set of rows".
На вход подаётся массив, а на выходе - ровно столько строк, сколько
элементов в массиве и согласно правилам, указанным выше.

--
// Dmitriy.