Re: Аналог distinct для массива

From: Dmitriy MiksIr <miksir(at)maker(dot)ru>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: Аналог distinct для массива
Date: 2008-02-21 16:56:37
Message-ID: fpkag5$8mk$1@ger.gmane.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

У меня другая задача немного. На примере, имеем записи:
[1,2,3]
[3,4]
[2,6]
нужно получить или один массив [1,2,3,4,6] или набор int-ов
1
2
3
4
6

Приходит в голову
FOR resrow IN
SELECT marks
FROM firms WHERE ...
LOOP
SELECT array_cat(carr,resrow.marks) INTO carr;
END LOOP;
и потом на carr натравить uniq... возможно это будет красивее, чем
вариант ниже.

А то, что в intarray описан оператор && который уже есть в 8.2 - не страшно?

Oleg Bartunov пишет:
> On Thu, 21 Feb 2008, Dmitriy MiksIr wrote:
>
>> Да, но того что может помочь не нашел. Может смотрел не туда.
>
> там есть функция uniq
>
>>
>> Единственная идея, что появилась - это сложить как-то все массивы по
>> строкам, и на итоговый сказать uniq ... но красивая реализация в
>> голову не идет.
>>
>> Или написать функцию, которая будет раскрывать масив и выдавать
>> результат как набор строк, т.е.
>> arr | other
>> [1,2,3] | bla
>> преобразовывать в
>> 1 | bla
>> 2 | bla
>> 3 | bla
>> только можно ли силами plpgsql пройтись циклом по массиву?
>>
>> Oleg Bartunov пишет:
>>> Если это integer arrays, то есть
>>> http://www.sai.msu.su/~megera/postgres/gist/intarray/README.intarray
>>> Заодно получишь много чего приятного :)
>>>
>>> Олег
>>> On Thu, 21 Feb 2008, Dmitriy MiksIr wrote:
>>>
>>>>
>>>> Приветствую!
>>>>
>>>> Есть необходимость выбирать уникальные значения из всей таблицы по
>>>> полю integer[] (уникальные как по строкам, так и по массиву). Делаю
>>>> сейчас это так (кусок функции):
>>>> SELECT max(array_upper(marks,1)) INTO size FROM firms WHERE ...;
>>>> FOR resrow IN
>>>> SELECT distinct(f.marks[g.n]) as result
>>>> FROM firms f, generate_series(1,size) g(n) WHERE ...;
>>>> ...
>>>> Не очень нравится такое решение своей красотой (ибо если, например,
>>>> одна строка - 100 элементов массива, а остальные - по 2-3,
>>>> получается очень накладно). Может есть другие решения?
>>>>
>>>>
>>>> ---------------------------(end of
>>>> broadcast)---------------------------
>>>> TIP 3: Have you checked our extensive FAQ?
>>>>
>>>> http://www.postgresql.org/docs/faq
>>>>
>>>
>>> Regards,
>>> Oleg
>>> _____________________________________________________________
>>> Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
>>> Sternberg Astronomical Institute, Moscow University, Russia
>>> Internet: oleg(at)sai(dot)msu(dot)su,
>>> http://www.sai.msu.su/~megera/
>>> phone: +007(495)939-16-83, +007(495)939-23-83
>>> ---------------------------(end of broadcast)---------------------------
>>> TIP 9: In versions below 8.0, the planner will ignore your desire to
>>> choose an index scan if your joining column's datatypes do not
>>> match
>>>
>>
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 6: explain analyze is your friend
>>
>
> Regards,
> Oleg
> _____________________________________________________________
> Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
> Sternberg Astronomical Institute, Moscow University, Russia
> Internet: oleg(at)sai(dot)msu(dot)su,
> http://www.sai.msu.su/~megera/
> phone: +007(495)939-16-83, +007(495)939-23-83
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to
> majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly
>

In response to

Browse pgsql-ru-general by date

  From Date Subject
Next Message Zayats Alexey 2008-03-03 12:03:01 Index Scan Backward
Previous Message Oleg Bartunov 2008-02-21 16:39:03 Re: Re: Аналог distinct для массива