数组类型

神通数据库允许记录的字段定义成不定长的一维或多维数组。数组类型可以是任何基本类型。

数组类型的声明

我们先创建一个包含数组的表:

CREATE TABLE T (
A integer[]
);

数组类型是通过在数组元素类型名后面附加方括弧([])来命名的。上面的命令会创建一个叫 T 的表,它有一个一维 integer型数组(A)。

CREATE TABLE 的语法允许声明数组的确切大小,比如:

CREATE TABLE T (
A integer[2][2]
);

但是这样的声明并没有实际作用,声明长度的数组和未声明长度的数组相同。而且目前的声明也不强制数组维数。拥有同一元素类型的数组都被认为是相同的类型,不管他们的大小或者维数。因此,在 CREATE TABLE 里定义数字或者维数都并不影响运行时的行为。

数组值输入

把一个数组数值写成一个文本值的时候,我们用花括弧把数值括起来并且用逗号将它们分开。 如果某个值内部包含逗号或者花括弧,那么必须在它周围加上单引号。 例如,一个3乘3的二维数组的一个元素可以用以下方式来表示: '{{1,2,3},{4,5,6},{7,8,9}}' 。下边是一些类型的声明:

insert into T values('{1,2,3,4,5,6,7,8,9}');
insert into T values('{{1,2,3},{4,5,6},{7,8,9}}');

以上分别是一个一维数组和一个3乘3的多维数组的输入。需要注意:数组的独立元素不能是SQL空值。 整个数组可以设置为空,但是不能存在这么一个数组,里面有些元素是空,而有些不是。 下边是插入的结果:

A
---------------------------
{1,2,3,4,5,6,7,8,9}
{{1,2,3},{4,5,6},{7,8,9}}
(2 行)

数组的访问

下边是一个数组访问的例子:

select * from t where a[2][2]=5;
A
---------------------------
{{1,2,3},{4,5,6},{7,8,9}}
(一行)

方括号内放的是数组的脚标,脚标的值从1开始,例如,一个n元素的数组array,从array[1]开始,到array[n]结束。

我们还可以访问一个数组的任意长方形片断,或称子数组。 对于一维或更多维数组,一个数组的某一部分是用脚标下界:脚标上界表示的。 例如:

select a[1:2][2:3] from T;
A
---------------
{{2,3},{5,6}}
(2 行)

注解

因为第一行所存的是一维数组,按照三维数组去取,将取不到任何数据,输出sql空值。

数组的修改

一个数组可以直接被重新赋值,比如:

update T set A = '{5,6,7,8,9}' where A[1] = 1 ;

也可以只更新个别元素,比如:

update T set A[2] = 60 where A[1] = 1 ;

或者更新某个片段,比如:

update T set A[2:3] = '{10,20}' where A[1] = 1 ;

个别元素或者片段的更新对象,必须是原本数组中已经拥有值的元素或者片段,仅仅除了以下这种情况:

我们可以通过给一个和已存在的元素相邻元素赋值的方法,或者是向已存在的数据相邻或重叠的区域赋值的方法来扩大一个一维数组。比如,如果一个数组 A 当前有 3 个元素,那么如果我们给 A[4] 赋值后,它就有四个元素。若我们给片段A[4:7]赋值,它就会有7个元素。也可以往数组左侧扩展,需要注意,这仅仅适用于一维数组。

数组片段赋值允许创建不使用一为基的下标的数组。比如,我们可以给 A[-2:7] 赋值,创建一个脚标值在 -2 和 7 之间的数组。

在任何情况下,我们给一个数组元素赋值的时候,必须保证以下前提:不能使数组中出现空值。也就是说,如果我们要给A[n](n为正整数)赋值,那么必须保证A[1:n-1]中每个元素都已经有值。如果我们要给A[-n](n为正整数)赋值,那么必须保证A[1-n:1]中每个元素都已经有值。

在存储过程或者函数中使用数组

存储过程中,只允许使用一维数组。并可以使用以下方式赋初始值:

declare
a int[] := '{1,2,3}';

上边定义的数组,内部各元素的值分别为:

a[1]=1,
a[2]=2,
a[3]=3,

存储过程中也可以直接对某一元素赋值,如:

a[2] = 8;
a[0] = 10;

同样,在任何情况下,我们给一个数组元素赋值的时候,必须保证以下前提: 不能使数组中出现空值。也就是说,如果我们要给A[n](n为正整数)赋值, 那么必须保证A[1:n-1]中每个元素都已经有值。如果我们要给A[-n](n为正整数)赋值, 那么必须保证A[1-n:1]中每个元素都已经有值。