リレーショナルモデルの主義の1つは、テーブルの行は原子的であるということです。 Postgresではこの制約がありません。 行は問い合わせ言語からアクセスされることが可能な部分値を 含むことができます。例えば、基本型が配列である行を作成することできます。
Postgresでは、列の行は 固定長あるいは可変長の多次元配列を定義することが可能です。 いかなる基本型、またはユーザ定義型である配列か作成可能です。 それらの使用法を説明するために、例としてまず既存の型の 配列のクラスを作成します。
CREATE TABLE SAL_EMP (
name text,
pay_by_quarter integer[],
schedule text[][]
);
上記の問い合わせは、SAL_EMPというテーブルを作成し、 氏名を表すtext型文字列(name)、 従業員の4半期毎の給料を表すinteger型 一次元配列(pay_by_quarter)、従業員の1週間のスケジュールを表す text 型二次元配列(schedule)が作成されます。 そこに幾つかのINSERT文を実行してみます。 配列へデータを追加する時には、値を括弧で囲み、そしてそれらをカンマで 区切ることに注意してください。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"}}');
Postgresではデフォルトで
配列の番号付け規約に"1始まり"を起用しています。
それはつまりn個要素の有る配列は、array[1]で始まり、
array[n]で終わります。ここで、SAL_EMPテーブルに対し
問い合わせが行ってみます。まず、一度に1つの配列の
要素にアクセスする方法は、下記のようになります。
SELECT name
FROM SAL_EMP
WHERE SAL_EMP.pay_by_quarter[1] <>
SAL_EMP.pay_by_quarter[2];
+------+
|name |
+------+
|Carol |
+------+
また、下記の問い合わせは全ての従業員の第 3四半期の給料を検索します。
SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP;
+---------------+
|pay_by_quarter |
+---------------+
|10000 |
+---------------+
|25000 |
+---------------+
同様に、それぞれのサブスクリプトの上限/下限を指定することによって、 配列/副配列の任意の部分を取り出すことも可能です。 下記の問い合わせは、週の始めの2日間のBillさんのスケジュールにある、 最初の項目を検索します。
SELECT SAL_EMP.schedule[1:2][1:1]
FROM SAL_EMP
WHERE SAL_EMP.name = 'Bill';
+-------------------+
|schedule |
+-------------------+
|{{"meeting"},{""}} |
+-------------------+