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