有时并不需要重新生成序表,而只需在已有数据中添加所需内容,此时可以使用derive函数在序表或排列上添加计算字段,生成新序表。如:
|
A |
1 |
$(demo) select EID,NAME,SURNAME,BIRTHDAY,GENDER from EMPLOYEE |
2 |
=A1.derive(age(BIRTHDAY)) |
3 |
=A2.derive(NAME+" "+SURNAME:FullName) |
4 |
=A1.derive(:FullName) |
A1中的原序表数据如下:
A2用derive函数由A1引出新序表,添加了员工年龄字段,结果如下:
可以看到,在A1原有的字段基础上,又添加了根据BIRTHDAY字段计算出的年龄字段,而新字段未命名,使用生成表达式age(BIRTHDAY)作为字段名。另外,derive函数实际上可以看为new函数的简化写法,在执行时会生成新序表。因此A2中生成新序表,而A1中的序表并不会受影响。
A3根据A2中的结果,又添加了员工的全名字段,结果如下:
可以看到,A2的序表中所有字段都被复制,只是在最后添加了新字段。在A3的表达式中,将新字段命名为FullName。同样,A3中的计算不会影响A2中的结果。
在A4中,重新使用A1作为原序表,添加字段时,只将其命名为FullName,而没有生成表达式,结果如下:
可以发现,如果没有生成的表达式,会生成空字段返回。
|
A |
1 |
$(demo) select EID,NAME,SURNAME,BIRTHDAY,GENDER from EMPLOYEE |
2 |
=A1.derive(age(BIRTHDAY),NAME+" "+SURNAME:FullName) |
3 |
=A1.derive(age(BIRTHDAY):Age,string(Age)+GENDER:Group) |
在使用derive函数时,也可以一次添加多个字段,在这个例子中,A2的结果如下:
它和上面例子中分步添加字段的结果是相同的。
在A3中,添加了年龄字段,以及用年龄和GENDER字段计算出的分组代码,结果如下:
A3的表达式中,不但一次添加了2个字段,而且第2个字段Group中还引用到了新加的字段Age中的数据,在derive函数中,后生成的字段是可以使用已生成的字段的。还有一点需要注意的是,在集算器中,如果需要将实数与字符串连接,需要先将实数转化成字符串。
需要注意的是,derive函数并不是单纯添加一列,它和new函数同样需要新建序表,因此在执行时,会在新的序表中重建每一条记录。因此,derive函数和new函数的执行效率并不太高,在需要添加多个字段的情况下,仅执行一次derive,效率会明显更高。所以,A2中的执行方案,要比上例中分步添加的方案更好。即使有些数据在最初无法确定,也可以在执行derive函数时先生成空字段,在后面的程序中用A.run() 函数再次赋值。如:
|
A |
1 |
$(demo) select EID,NAME,SURNAME,BIRTHDAY,GENDER from EMPLOYEE |
2 |
=A1.derive(age(BIRTHDAY),:FullName) |
3 |
>A2.run(FullName=NAME+" "+SURNAME) |
这样的处理方案,由于不必重新生成序表中的记录,仅需要赋值,要比分两步derive的效率更高些。
与new函数类似,使用derive函数时,也可以添加@i选项,当用表达式计算所添加的列时,如果其中出现空值则不添加对应的记录。