Tableau 'animaux':
animal_name animal_type
Tom Cat
Jerry Mouse
Kermit Frog
Question:
SELECT
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM animals;
Résultat attendu:
Tom;Jerry;Kerimt, Cat;Mouse;Frog
OR
Tom;Kerimt;Jerry, Cat;Frog;Mouse
Puis-je être sûr que l'ordre dans la première fonction d'agrégat sera toujours le même que dans la seconde. Je veux dire que je n'aimerais pas recevoir:
Tom;Jerry;Kermit, Frog;Mouse,Cat
Si vous utilisez une version de PostgreSQL <9.0, alors:
De: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html
Dans la mise en œuvre actuelle, l'ordre des entrées est en principe non spécifié. Toutefois, la fourniture des valeurs d'entrée à partir d'une sous-requête triée fonctionnera généralement. Par exemple:
SELECT xmlagg (x) FROM (onglet SELECT; SELECT x FROM test ORDER BY y DESC);
Donc, dans votre cas, vous écririez:
SELECT
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM (SELECT animal_name, animal_type FROM animals) AS x;
L'entrée dans array_agg serait alors désordonnée mais identique dans les deux colonnes. Et si vous le souhaitez, vous pouvez ajouter un ORDER BY
clause à la sous-requête.
Utilisez un ORDER BY, comme cet exemple du manual :
SELECT array_agg(a ORDER BY b DESC) FROM table;