PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Sélection de données dans un tableau Postgres

Vous ne pouvez pas utiliser array_agg() pour produire des tableaux multidimensionnels, du moins pas jusqu'à PostgreSQL 9.4.
(Mais le prochain Postgres 9.5 livre une nouvelle variante de array_agg() ça peut !)

Ce que vous obtenez de la requête de @Matt Ball est un tableau d'enregistrements (the_table[] ).

Un tableau ne peut contenir que des éléments du même type de base. Vous avez évidemment des types de nombres et de chaînes. Convertir toutes les colonnes (qui ne le sont pas déjà) en text pour le faire fonctionner.

Vous pouvez créer une fonction d'agrégation pour cela comme je vous l'ai déjà démontré ici.

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

Appel :

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

Notez le ARRAY[] supplémentaire couche pour en faire un tableau multidimensionnel (bidimensionnel, pour être précis).

Démo instantanée :

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;