Nota: Este debe convertirse en una capítulo sobre el comportamiento de los arreglos. ¿Voluntarios? - thomas 1998-01-12
Postgres permite que los atributos de una instancia sean definidos como un arreglo multidimensional de longitud fija o variable. Pueden crearse arreglos de cualquier tipo (incluyendo tipos definidos por el usuario). Para ilustar su uso, primero creamos una clase con arreglos de tipos base.
CREATE TABLE SAL_EMP (
name text,
pay_by_quarter int4[],
schedule text[][]);
La consulta de arriba creará una clase llamada SAL_EMP con una cadena de tipo text (name), un arreglo unidimensional de tipo int4 (pay_by_quarter), que representa el salario trimestral del empleado y una arreglo bidimensional de tipo text (schedule), el cual representa el horario semanal del empleado. Ahora hacemos algunos INSERTSs; note que cuando se agregan elementos a un arreglo, encerramos los valores entre llaves y los separamos con comas. Si usted conoce el lenguaje C, esto no es muy diferente de la sintáxis que se utiliza para inicializar estructuras.
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"}}');
Por defecto Postgres utiliza la convención de "numeración basada en uno" para los arreglos -- esto es, un arreglo de n elementos comienza con arreglo[1] y finaliza con arreglo[n]. Ahora, podemos correr algunas consultas sobre SAL_EMP. Primero, mostramos como acceder a un elemento de uno de los arreglos a la vez. Esta consulta recupera los nombres de los empleados cuyos pagos cambiaron en el segundo trimestre:
SELECT name
FROM SAL_EMP
WHERE SAL_EMP.pay_by_quarter[1] <>
SAL_EMP.pay_by_quarter[2];
+------+
|name |
+------+
|Carol |
+------+
La siguiente consulta recupera el pago del tercer trimestre de todos los empleados:
SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP; +---------------+ |pay_by_quarter | +---------------+ |10000 | +---------------+ |25000 | +---------------+
También podemos acceder arbitrariamente a distintas porciones del arreglo, o subarreglos. Esta consulta recupera el primer item de la agenda de Bill para los primeros dos días de la semana.
SELECT SAL_EMP.schedule[1:2][1:1]
FROM SAL_EMP
WHERE SAL_EMP.name = 'Bill';
+-------------------+
|schedule |
+-------------------+
|{{"meeting"},{""}} |
+-------------------+