Nota: Este debe convertirse en una capítulo sobre el comportamiento de los matrices. ¿Voluntarios? - thomas 1998-01-12
Postgres permite que los atributos de una instancia sean definidos como una matriz multidimensional de longitud fija o variable. Pueden crearse matrices de cualquier tipo (incluyendo tipos definidos por el usuario). Para ilustrar su uso, primero creamos una clase con matrices 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), una matriz unidimensional de tipo int4 (pay_by_quarter), que representa el salario trimestral del empleado y una matriz bidimensional de tipo text (schedule), el cual representa el horario semanal del empleado. Ahora hacemos algunos INSERT; fíjese que cuando se agregan elementos a una matriz, encerramos los valores entre llaves y los separamos con comas. Si usted conoce el lenguaje C, esto no es muy diferente de la sintáis 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 las matrices, esto es, una matriz de n elementos comienza con array[1] y finaliza con array[n]. Ahora, podemos hacer algunas consultas sobre SAL_EMP. Primero, mostramos cómo acceder a un elemento de una de las matrices 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 de la matriz o submatrices. Esta consulta recupera el primer elemento 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"},{""}} | +-------------------+