3.1.1由已有的数据新建序表

根据已有的序列或序表中的数据,可以用A.new() 函数来新建序表,如:

 

A

1

[1,2,3,4,5]

2

$(demo) select * from EMPLOYEE

3

=A2.select(STATE=="Texas")

4

=A1.new(~,~*~,~*~*~)

5

=A2.new(EID,NAME+" "+SURNAME,GENDER,age(BIRTHDAY))

6

=A3.new(EID,NAME+" "+SURNAME,GENDER,STATE)

A1中是个简单的序列,A2中是从数据库中获取的员工信息序表,A3是从A2中选出的Texas州员工记录构成的序列。A4~A6分别根据序列、序表和排列,用new函数新建序表。

A4中序表如下:

A5中序表如下:

A6中序表如下:

从以上结果中可以发现,A.new() 函数在计算时,循环A中的每一个成员,计算表达式,得到记录填入到新序表中。在new函数中,可以引用A中的成员,当A是序列或排列时,还可以使用记录的字段值来计算。在默认情况下,新序表的字段名即为生成时使用的表达式,如age(BIRTHDAY)。如果新序表中的字段完全来自旧的序表,在没有为新字段命名的情况下,会使用旧的字段名,如EIDGENDER,其实它们也是生成字段时使用的表达式。在新建序表时,可以只取出需要的数据来生成新序表中的记录。

当新序表的字段名使用表达式时,往往不便于使用,因此,通常需要在新建序表时为字段命名。如:

 

A

1

[1,2,3,4,5]

2

$(demo) select * from EMPLOYEE

3

=A2.select(STATE=="Texas")

4

=A1.new(~:Value,~*~:Square,~*~*~:Cube)

5

=A2.new(EID,NAME+" "+SURNAME:FullName,GENDER, age(BIRTHDAY):Age)

6

=A3.new(EID,NAME+" "+SURNAME:NAME,GENDER,STATE)

A4,A5A6中的结果分别如下:

可以发现,使用new函数时,如果要为新字段命名,只要在对应字段的生成表达式后面,添加字段名就可以了,与表达式用冒号隔开,如NAME+" "+SURNAME:FullName,表示由原序表中记录的NAMESURNAME字段,计算出员工的全名,在新序表的该字段命名为FullName

另外,如果是根据连续的数字构成的序列生成新序表,如A1中的序列,可以简写为n.new() 的格式,如:

 

A

1

=5.new(~:Value,~*~:Square,~*~*~:Cube)

2

$(demo) select * from EMPLOYEE

3

=100.new(A2(~).(NAME+" "+SURNAME):Name,rand(5)+1:Group)

A1中即为上例A4中表达式的简写,结果和前面是相同的:

A3中同样用数字来循环执行new函数,生成100条记录,将员工表中前100位员工随机分到1~5中的某个分组中,结果序表如下:

在用new函数新建序表时,表达式中可以使用新序表中的字段,如:

 

A

1

$(demo) select * from EMPLOYEE

2

=A1.new(EID,NAME+" "+SURNAME:FullName, FullName[-1]:PREV)

3

=A1.new(EID,NAME+" "+SURNAME:NAME)

4

= A1.new(EID,NAME+" "+SURNAME:NAME,NAME[-1]:PREV)

5

=A1.new(EID,NAME+" "+SURNAME:NAME, NAME[-1]+" "+ SURNAME[-1]:PREV)

A2中用new函数生成新序表时,先计算出了员工的全名,同时在另一个字段中引用了前一位员工的全名,结果如下:

有时候,新的字段名也可以与原序表中的相同,如A3中计算员工的全名仍然用NAME作为字段名:

但是,在这种情况下,A4中的代码出现了问题,其中使用NAME[-1]:PREV引用前一位员工的名字,命名为新字段PREV,由于A1中同样存在NAME字段,在解析时,同名字段会优先处理为原序表中的字段,所以A4中得到的结果如下:

可以发现,A4中只是获得了原序表中员工的名字而不是新计算出的全名。

此时,PREV字段只能仍然用A1中的字段来计算,如A5中的方法,结果如下:

使用new函数时,可以添加@i选项,此时,如果执行时某条记录在字段表达式的计算结果中,出现了空值,则这条记录不会添加到新序表中,如:

 

A

1

$(demo) select * from EMPLOYEE

2

=A1.new@i (EID,NAME+" "+SURNAME:NAME, if(GENDER=="M","Male"):Gender)

A2中计算Gender字段时,只将男员工的原值M转换为Male,而女员工的对应值则为空,因此结果中不会出现女员工的数据,A2中结果如下: