GBase 8c允许定义变长多维数组,例如:
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
);
CREATE TABLE
数组数据类型通过在数据类型后面加上方括号([])来命名。
上述例子中创建一个名为sal_emp的表,它的列分别为:
- 类型为text的列name;
- 一维integer类型数据pay_by_quarter;
- 二维text类型数组schedule。
同时,CREATE TABLE的语法也允许指定数组的确切大小,例如:
CREATE TABLE tictactoe (
squares integer[3][3]
);
CREATE TABLE
但是这种指定并不限制数组的大小和长度,并不影响后续运行时的行为。
或者写成:
pay_by_quarter integer ARRAY[4],
或者:
pay_by_quarter integer ARRAY,
数组的输入,一般将元素值用花括号包围并用逗号分隔。例如:
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
'{{"meeting", "lunch"}, {"training", "presentation"}}');
INSERT 0 1
INSERT INTO sal_emp
VALUES ('Carol',
ARRAY[20000, 25000, 25000, 25000],
ARRAY[['breakfast', 'consulting'], ['meeting', 'lunch']]);
INSERT 0 1
数组的查询操作与表查询类似。例如:
SELECT * FROM sal_emp;
name | pay_by_quarter | schedule
-------+---------------------------+-------------------------------------------
Bill | {10000,10000,10000,10000} | {{meeting,lunch},{training,presentation}}
Carol | {20000,25000,25000,25000} | {{breakfast,consulting},{meeting,lunch}}
(2 rows)
对所有员工第三季度工资查询:
SELECT pay_by_quarter[3] FROM sal_emp;
pay_by_quarter
----------------
10000
25000
(2 rows)
数组的修改,可以使用UPDATE语句。例如:
UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Carol';
UPDATE 1
数组的搜索:
SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);
name | pay_by_quarter | schedule
------+---------------------------+-------------------------------------------
Bill | {10000,10000,10000,10000} | {{meeting,lunch},{training,presentation}}
(1 row)