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

Tableaux multidimensionnels PostgreSQL

Tableau Postgres éléments sont toujours des éléments de base , c'est-à-dire scalaire valeurs. Les sous-tableaux ne sont pas des "éléments" dans Postgres. Les tranches de tableau conservent leurs dimensions d'origine.

Vous pouvez soit extraire un élément de base , qui est une valeur du type de données d'élément scalaire.
Vous pouvez également extraire une tranche de tableau , qui conserve le type de données du tableau d'origine ainsi que les dimensions du tableau d'origine.

Votre idée de récupérer un sous-tableau en tant qu'"élément" serait en conflit avec cela et n'est tout simplement pas implémentée.

Le manuel pourrait être plus clair dans son explication. Mais au moins, nous pouvons trouver :

Votre 1er exemple essaie de référencer un élément de base, qui n'est pas trouvé (vous auriez besoin de deux index de tableau dans un tableau 2-D). Donc Postgres renvoie NULL.
Votre 3ème exemple enveloppe simplement le NULL résultant dans un nouveau tableau.

Pour aplatir une tranche de tableau (en faire un tableau 1-D), vous pouvez unnest() et alimentez l'ensemble résultant à un nouveau ARRAY constructeur . Soit dans une sous-requête corrélée, soit dans un LATERAL joindre (nécessite pg 9.3+). Démonstration des deux :

SELECT s.col[2:2][2:3] AS slice_arr
     , x.lateral_arr
     , ARRAY(SELECT unnest(s.col[2:2][2:3])) AS corr_arr
FROM  (SELECT ARRAY[[1,2,3],[4,5,6]] AS col) s
     , LATERAL (SELECT ARRAY(SELECT * FROM unnest(s.col[2:2][2:3])) AS lateral_arr) x;

Et assurez-vous de lire la version actuelle du manuel . vos références pointent vers Postgres 9.1, mais il y a de fortes chances que vous utilisiez réellement Postgres 9.4.

Connexe :