Подскажите пожалуйста кто нибудь:
Допустим есть результат запроса:
id|usluga
1|интернет
1|телефон
2|интернет
нужно что бы получилось:
id|usluga
1|интернет,телефон
2|интернет
функции CONCAT на сколько я понял у postgresql нет
Функция:
CREATE FUNCTION concat(char,char) RETURNS CHAR AS '
SELECT
CASE WHEN $1 = \'\' or $1 IS NULL THEN
CASE WHEN $2=\'\' OR $2 IS NULL THEN
\'\'
ELSE
$2
END
ELSE
CASE WHEN $2=\'\' OR $2 IS NULL THEN
$1
ELSE
$1 ||''; ''|| $2
END
END
' LANGUAGE SQL;
Агрегируем:
create aggregate concat(basetype = char, sfunc = concat, stype = char, initcond = '' );
Сам запрос:
SELECT
public.tabel.key,
public.tabel.kvartira,
public.tabel.brigada,
public.cabel.dat,
concat(public.uslugi.dat) AS cr,
public.tabel.date1,
public.tabel.avtor
FROM
public.temp_key_uslugi
INNER JOIN public.tabel ON (public.temp_key_uslugi.key_tabel = public.tabel.key)
INNER JOIN public.cabel ON (public.tabel.kabel = public.cabel.key)
INNER JOIN public.uslugi ON (public.temp_key_uslugi.key_usluga = public.uslugi.key)
INNER JOIN public.raion ON (public.tabel.raion = public.raion.n)
GROUP BY
public.tabel.key,
public.tabel.kvartira,
public.tabel.brigada,
public.cabel.dat,
public.tabel.date1,
public.tabel.avtor
ORDER BY
public.tabel.key
Что бы вариант который вы предлогаете подошел нужно колдавать с вложенным запрсом. А вот увеличет это скорость работы.....
Есть: http://postgresql.ru.ne
Есть:
http://postgresql.ru.net/manual/functions-string.html
первая же функция в таблице
Это просто конкатинаяция, с
Это просто конкатинаяция, с group by она неработает.
Мне пришлось написать собственную агрегантую функцию.
Если кому нибудь нужно могу выложить.
я думаю такой вариант будет
я думаю такой вариант будет работать быстрее, чем Ваша агрегантная функция.
А код выкладывайте, может действитеьно кому-то пригодится.
Функция: CREATE FUNCTION
Функция:
CREATE FUNCTION concat(char,char) RETURNS CHAR AS '
SELECT
CASE WHEN $1 = \'\' or $1 IS NULL THEN
CASE WHEN $2=\'\' OR $2 IS NULL THEN
\'\'
ELSE
$2
END
ELSE
CASE WHEN $2=\'\' OR $2 IS NULL THEN
$1
ELSE
$1 ||''; ''|| $2
END
END
' LANGUAGE SQL;
Агрегируем:
create aggregate concat(basetype = char, sfunc = concat, stype = char, initcond = '' );
Сам запрос:
SELECT
public.tabel.key,
public.tabel.kvartira,
public.tabel.brigada,
public.cabel.dat,
concat(public.uslugi.dat) AS cr,
public.tabel.date1,
public.tabel.avtor
FROM
public.temp_key_uslugi
INNER JOIN public.tabel ON (public.temp_key_uslugi.key_tabel = public.tabel.key)
INNER JOIN public.cabel ON (public.tabel.kabel = public.cabel.key)
INNER JOIN public.uslugi ON (public.temp_key_uslugi.key_usluga = public.uslugi.key)
INNER JOIN public.raion ON (public.tabel.raion = public.raion.n)
GROUP BY
public.tabel.key,
public.tabel.kvartira,
public.tabel.brigada,
public.cabel.dat,
public.tabel.date1,
public.tabel.avtor
ORDER BY
public.tabel.key
Что бы вариант который вы предлогаете подошел нужно колдавать с вложенным запрсом. А вот увеличет это скорость работы.....
Судя по тому как используется
Судя по тому как используется функция в запросе, предлагаю посмотреть еще функцию coalesce.
Используйте array_agg()
попробуйте так: