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