PostgreSQL 9.0 или новее:
Современный Postgres (с 2010 г.) имеет _1 _ функция, которая будет делать именно то, что искал спрашивающий:
SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;
Postgres 9 также добавил возможность указывать предложение ORDER BY
в любом агрегированное выражение; в противном случае вам придется упорядочить все результаты или иметь дело с неопределенным порядком. Итак, теперь вы можете написать:
SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;
PostgreSQL 8.4.x:
PostgreSQL 8.4 (в 2009 г.) представил совокупный функция array_agg(expression)
, которая собирает значения в массив. Тогда array_to_string()
можно использовать для получения желаемого результата:
SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;
PostgreSQL 8.3.x и старше:
Когда изначально был задан этот вопрос, не существовало встроенной агрегатной функции для объединения строк. Простейшая индивидуальная реализация (, предложенная Вайдой Габо в этом сообщении списка рассылки, среди многих других) заключается в использовании встроенной функции textcat
(которая находится за оператором ||
):
CREATE AGGREGATE textcat_all(
basetype = text,
sfunc = textcat,
stype = text,
initcond = ''
);
Вот CREATE AGGREGATE
документация.
Это просто склеивает все струны вместе без разделителя. Чтобы вставить между ними, не имея его в конце, вы можете создать свою собственную функцию конкатенации и заменить ее на текстовый код, указанный выше. Вот один, который я собрал и протестировал на 8.3.12:
CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;
Эта версия будет выводить запятую, даже если значение в строке пустое или пустое, поэтому вы получите следующий результат:
a, b, c, , e, , g
Если вы предпочитаете удалить лишние запятые, чтобы вывести это:
a, b, c, e, g
Затем добавьте ELSIF
проверку к функции следующим образом:
CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSIF instr IS NULL OR instr = '' THEN
RETURN acc;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;
person
Neall
schedule
04.09.2008