Chapitre 8. Tableaux

Note

Ceci doit devenir un chapitre sur le comportement des tableaux. Des volontaires ? - thomas 12-01-1998.

Postgres fournit des attributs d'une instance qui seront définis comme tableaux multidimensionnels de longueur-fixe ou de longueur-variable. Des rangs de n'importe quel type base ou type utilisateur peuvent être créés. Pour illustrer leur utilisation, nous créerons en premier une classe avec des tableaux de type base.
CREATE TABLE SAL_EMP (
    name            text,
    pay_by_quarter  int4[],
    schedule        text[][]
);

La requête ci-dessus créera une classe nommée SAL_EMP avec une chaîne text (nom), un tableau uni-dimensionnel int4 (pay_by_quarter), lequel représente les salaires des employés par trimestre et un tableau bi-dimensionnel text (agenda), lequel représente les horaires des employés dans la semaine. Maintenant, faisons quelques INSERT :
INSERT INTO SAL_EMP
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {}}');

INSERT INTO SAL_EMP
    VALUES ('Carol',
    '{20000, 25000, 25000, 25000}',
    '{{"talk", "consult"}, {"meeting"}}');
Par défaut, Postgres utilise la convention de numérotage "à partir de 1" pour les tableaux -- ainsi un tableau de n éléments démarre avec la table [1] et finit avec la table [n]. Maintenant, nous pouvons lancer quelques requêtes sur SAL_EMP. En premier, nous montrons comment aborder un élément simple d'un tableau à un moment donné. Cette requête retrouve les noms des employés dont la paie a changé au cours du second trimestre :
SELECT name
    FROM SAL_EMP
    WHERE SAL_EMP.pay_by_quarter[1] <>
    SAL_EMP.pay_by_quarter[2];

+------+
|name  |
+------+
|Carol |
+------+

Cette requête retrouve la paie du troisième trimestre de tous les employés :
SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP;


+---------------+
|pay_by_quarter |
+---------------+
|10000          |
+---------------+
|25000          |
+---------------+

Nous pouvons aussi retrouver des tranches arbitraires de tables, ou sous-tables. Cette requête retrouve le premier item de l'agenda de Bill pour les deux premiers jours de la semaine.
SELECT SAL_EMP.schedule[1:2][1:1]
    FROM SAL_EMP
    WHERE SAL_EMP.name = 'Bill';

+-------------------+
|schedule           |
+-------------------+
|{{"meeting"},{""}} |
+-------------------+