Query von Oralce auf Postgres anpassen: STRING_AGG statt LISTAGG

Hallo Leute,

ich muss ein Java-Tool von Oracle auf Postgres umstellen.

In einem der Queries nutze ich die LISTAGG-Funktion. Equivalent dazu heißt die Postgres-Funtion STRING_AGG. Allerdings erhalte ich eine Fehlermeldung.

Oracle-Query:

SELECT c.*, org.name, c_in.d, c_grp_join.group_ids, dfs_c_at.dfs_id FROM c LEFT JOIN ou org on c.ou_idx = org.ou_idx LEFT c_in ON c.c_id = c_in.c_id LEFT dfs_c_at ON c.c_id = dfs_c_at.c_ID LEFT (SELECT c_ID, LISTAGG(c_grp_id, ',') WITHIN GROUP (ORDER BY c_grp_id) AS group_ids FROM c_grp_at group by c_id) c_grp_join ON c.c_ID = c_grp_join.c_ID WHERE c.c_id = ?

Postgres-Query:

SELECT c.*, org.name, c_in.d, c_grp_join.group_ids, dfs_c_at.dfs_id FROM c LEFT JOIN ou org on c.ou_idx = org.ou_idx LEFT c_in ON c.c_id = c_in.c_id LEFT dfs_c_at ON c.c_id = dfs_c_at.c_ID LEFT (SELECT c_ID, STRING_AGG(c_grp_id, ',') WITHIN GROUP (ORDER BY c_grp_id) AS group_ids FROM c_grp_at group by c_id) c_grp_join ON c.c_ID = c_grp_join.c_ID WHERE c.c_id = ?



ERROR:  function string_agg(bigint, unknown, bigint) does not exist

Ich übergebe der Funktion gar keinen dritten Parameter, oder?

Was übersehe ich?

Danke.

string_agg() aggregiert - wie der Name schon sagt - strings.

Du versuchst offensichtlich der Funktion ein bigint zu übergeben. Ein bigint ist aber nun mal kein String. Ausserdem gibt es das WITHIN GROUP bei Postgres nicht.

Versuch’s mal mit

STRING_AGG(c_grp_id::text, ',' order by c_grp_id)

Alle details dazu im Handbuch: http://www.postgresql.org/docs/current/static/functions-aggregate.html

Vielen Dank. Ich habe WITHIN GROUP entfernt. Es scheint nun zu funktionieren.