2012-08-01 10 views
9

tengo los siguientes datos:Selección de datos en una matriz de Postgres

name   id    url 

John   1    someurl.com 
Matt   2    cool.com 
Sam   3    stackoverflow.com 

¿Cómo puedo escribir una instrucción SQL en Postgres para seleccionar estos datos en un multi-dimensional array, es decir:

{{John, 1, someurl.com}, {Matt, 2, cool.com}, {Sam, 3, stackoverflow.com}} 

He visto este tipo de uso de matriz antes en Postgres, pero no tengo idea de cómo seleccionar datos de una tabla en este formato de matriz.

Suponiendo que todas las columnas son del tipo text.

Respuesta

21

No se puede utilizar para producir array_agg() matrices multidimensionales, al menos no hasta PostgreSQL 9.4.
(Pero la próxima Postgres 9.5 barcos un new variant of array_agg() que puede!)

Lo que se obtiene de @Matt Ball's query es una tabla de registros (the_table[]).

Una matriz solo puede contener elementos del mismo tipo de base. Obviamente tienes números y tipos de cadenas. Convierta todas las columnas (que no están ya) en text para que funcione.

Puede crear una función de agregado para esto como la que le demostré here anteriormente.

CREATE AGGREGATE array_agg_mult (anyarray) (
    SFUNC  = array_cat 
    ,STYPE  = anyarray 
    ,INITCOND = '{}' 
); 

Llamar:

SELECT array_agg_mult(ARRAY[ARRAY[name, id::text, url]]) AS tbl_mult_arr 
FROM tbl; 

Nota la ARRAY[] capa adicional para que sea una matriz multidimensional (2-dimenstional, para ser exactos).

demostración instantánea:

WITH tbl(id, txt) AS (
    VALUES 
     (1::int, 'foo'::text) 
    ,(2,  'bar') 
    ,(3,  '}b",') -- txt has meta-characters 
    ) 
    , x AS (
    SELECT array_agg_mult(ARRAY[ARRAY[id::text,txt]]) AS t 
    FROM tbl 
    ) 
SELECT *, t[1][3] AS arr_element_1_1, t[3][4] AS arr_element_3_2 
FROM x; 
+0

¡Increíble! Muchas gracias! –

+1

bueno mi amigo, usted es el llamado "deus ex machina" !!! – kostia

8

Necesita usar un aggregate function; array_agg debe hacer lo que necesita.

SELECT array_agg(s) FROM (SELECT name, id, url FROM the_table ORDER BY id) AS s; 
+1

Esta respuesta devuelve una matriz de registros, no una matriz multi-dimensional. –

+0

Sí, acabo de empezar a trabajar en contexto y tienes razón ... ¡Realmente necesito la matriz multidimensional! –

+1

@MattW: Creo que se te puede ayudar. :) Publicó una respuesta. –

Cuestiones relacionadas