Thread: Re: [pgsql-ru-general] Сконкатенировать два массива - DISTINCT
Как насчет модуля http://www.postgresql.org/docs/9.1/static/intarray.html с функцией uniq ?
Воскресенье, 1 сентября 2013, 14:30 +04:00 от "Dmitry E. Oboukhov" <unera@debian.org>:
--
Олексій Васильєв
Воскресенье, 1 сентября 2013, 14:30 +04:00 от "Dmitry E. Oboukhov" <unera@debian.org>:
есть записи в табличке
name: TEXT
tags: TEXT[]
приходит апдейт с новыми тегами
UPDATE
table
SET
tags = tags || ARRAY['newtag1', 'newtag2', 'newtag3']
WHERE
name = 'вася'
или, что тоже самое:
UPDATE
table
SET
tags = array_cat(tags, ARRAY['newtag1', 'newtag2', 'newtag3'])
WHERE
name = 'вася'
Вопрос, как *просто* удерживать список тегов в уникальном состоянии?
то есть если из новых тегов, скажем newtag2 уже есть в tags, то
newtag2 бы не добавился в список?
Понятно что можно сваять секцию WITH
WITH newtags (
SELECT
DISTINCT
unnest(tags || ARRAY['newtag1', 'newtag2', 'newtag3']) AS "tag"
FROM
table
WHERE
name = 'вася'
)
и потом их назад сагрегировать, но это что-то довольно сложное
получается.
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
name: TEXT
tags: TEXT[]
приходит апдейт с новыми тегами
UPDATE
table
SET
tags = tags || ARRAY['newtag1', 'newtag2', 'newtag3']
WHERE
name = 'вася'
или, что тоже самое:
UPDATE
table
SET
tags = array_cat(tags, ARRAY['newtag1', 'newtag2', 'newtag3'])
WHERE
name = 'вася'
Вопрос, как *просто* удерживать список тегов в уникальном состоянии?
то есть если из новых тегов, скажем newtag2 уже есть в tags, то
newtag2 бы не добавился в список?
Понятно что можно сваять секцию WITH
WITH newtags (
SELECT
DISTINCT
unnest(tags || ARRAY['newtag1', 'newtag2', 'newtag3']) AS "tag"
FROM
table
WHERE
name = 'вася'
)
и потом их назад сагрегировать, но это что-то довольно сложное
получается.
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
--
Олексій Васильєв
> Как насчет модуля http://www.postgresql.org/docs/9.1/static/intarray.html с > функцией uniq ?: <http://www.postgresql.org/docs/9.1/static/intarray.html" > data-mce-href="http://www.postgresql.org/docs/9.1/static/intarray.html">http:// > www.postgresql.org/docs/9.1/static/intarray.html с функцией У нас как бы массив текстушек :) я ща тоже набросал функцию text_uniq(text[]) и мне стало интересно можно ли как-то сделать функцию any_uniq(ANYARRAY[]) ? -- . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Attachment
Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сконкатенировать два массива - DISTINCT
From
Andrey Oktyabrskiy
Date:
On 01.09.2013 16:17, Dmitry E. Oboukhov wrote: > я ща тоже набросал функцию text_uniq(text[]) и мне стало интересно > можно ли как-то сделать функцию any_uniq(ANYARRAY[]) ? Нельзя. Можно сделать несколько функций с именем uniq для массивов разных типов. Кроме того, uniq из intarray работает только с одномерными массивами. И работает в точности так же, как юниксовая утилита uniq: uniq([1,2,3,3,2,1]) -> [1,2,3,2,1] Тогда как вам скорее всего надо uniq([1,2,3,3,2,1]) -> [1,2,3]