2011-09-06 21 views
52

Tabla 'animales':fin ARRAY_AGG PostgreSQL

animal_name animal_type 
Tom   Cat 
Jerry  Mouse 
Kermit  Frog 

Consulta:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names, 
array_to_string(array_agg(animal_type),';') animal_types 
FROM animals; 

Resultado esperado:

Tom;Jerry;Kerimt, Cat;Mouse;Frog 
OR 
Tom;Kerimt;Jerry, Cat;Frog;Mouse 

puedo estar seguro de que el orden en primera función agregada será siempre lo mismo que en el segundo. quiero decir que would't gusta llegar:

Tom;Jerry;Kermit, Frog;Mouse,Cat 
+6

Si está en 9.0 puede reemplazar las llamadas anidadas con un solo 'string_agg()' –

Respuesta

20

Si se encuentra en una versión de PostgreSQL 9.0 < a continuación:

Desde: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

En la implementación actual, el orden de la entrada en principio no está especificado. Sin embargo, el suministro de los valores de entrada desde una subconsulta ordenada funcionará. Por ejemplo:

SELECCIONE xmlagg (x) FROM (SELECCIONE x DESDE la orden de prueba POR y DESC) AS tabulación;

Así que en su caso se escribirían:

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; 

La entrada a la ARRAY_AGG sería entonces desordenada pero sería el mismo en ambas columnas. Y si lo desea, podría agregar una cláusula ORDER BY a la subconsulta.

+0

. Había pensado en esto, pero cuando salió buggy descubrí que el orden en una subconsulta extrañamente no funciona. Https://stackoverflow.com/questions/16248813/is-order-in- una subconsulta garantizada para ser preservada – Adamantish

171

Utilice un POR ORDEN, como en este ejemplo de la manual:

SELECT array_agg(a ORDER BY b DESC) FROM table; 
+25

Nota: 'ORDER BY' en' array_agg' se presenta en PostgreSQL 9 – UlfR

+4

Mucho mejor que la respuesta aceptada asumiendo PostgreSQL 9+. – Erik

+1

Podría dar muestra con ORDER BY para seleccionar: SELECCIONAR array_agg (nombre_animal), array_agg (tipo_animal) FROM animals; ? – GKislin