第八章. 數(shù)組
注意:這些必須在數(shù)組特性中成為一章,愿意做志愿者嗎? -thomas 1998-01-12
Postgres 允許記錄的字段定義成定長或不定長的多維數(shù)組.數(shù)組類型可以是任何基本類型或用戶定義類型.為說明這些用法,我們先創(chuàng)建一個由基本類型數(shù)組構(gòu)成的表:
CREATE TABLE sal_emp (
name text,
pay_by_quarter int4[],
schedule text[][]
);
上面的語句將創(chuàng)建一個叫 sal_emp 的表,它有一個 text 類型字符串字段(name), 一個一維 int4 型數(shù)組(pay_by_quarter),代表雇員的季度薪水和一個兩維text類型數(shù)組(schedule),表示雇員的周計劃.現(xiàn)在我們做一些插入(INSERTS),注意我們向數(shù)組字段追加數(shù)據(jù)時,我們用大括號把數(shù)據(jù)值括起來并且用逗號將它們分開.如果你懂 C ,這與初始化一個結(jié)構(gòu)很像。
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"}}');
(譯注:這里數(shù)組的初始化是向初始值最少的數(shù)組元素對齊的,
如上面第一個插入,庫中只存儲"meeting",是因為向第二組初始值'{}'對齊的結(jié)果)
現(xiàn)在我們可以在 sal_emp 上運行一些查詢。首先,我們演示如何一次訪問數(shù)組的一個元素.這個查詢檢索在第二季度薪水變化的雇員名:
SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];
name
-------
Carol
(1 row)
Postgres 缺省使用"以1為基" 的數(shù)組習慣-也就是說,一個n元素的數(shù)組從array[1]開始,到array[n]結(jié)束.
這個查詢檢索所有雇員第三季度的薪水:
SELECT pay_by_quarter[3] FROM sal_emp;
pay_by_quarter
----------------
10000
25000
(2 rows)
我們還可以訪問一個數(shù)組的任意部分,或稱子數(shù)組.對于一維或更多維數(shù)組,一個數(shù)組的某一部分是用"底腳標 : 高腳標"表示的。下面查詢檢索Bill該周頭兩天的第一件計劃.
SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';
schedule
--------------------
{{"meeting"},{""}}
(1 row)
我們還可以寫
SELECT schedule[1:2][1] FROM sal_emp WHERE name = 'Bill';
獲取同樣的結(jié)果。
一個數(shù)組值可以完全被代替:
UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Carol';
或者只是更新某一個域:
UPDATE sal_emp SET pay_by_quarter[4] = 15000
WHERE name = 'Bill';
或者更新某個部分:
UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
WHERE name = 'Carol';
目前不可能重新改變一個數(shù)組的大小,除非完全替換數(shù)組;比如,我們無法通過賦予 array[5] 數(shù)值把一個四個元素的數(shù)組改變?yōu)橐粋€五元素的數(shù)組?!?
CREATE TABLE 的語法允許定義固定長度的數(shù)組:
CREATE TABLE tictactoe (
squares int4[3][3]
);
不過,目前的實現(xiàn)并不強制數(shù)組尺寸限制 --- 這個特點與未聲明長度數(shù)組一樣?!?
--------------------------------------------------------------------------------