Matrices

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"},{""}} |
+-------------------+