本章介绍run()函数的多种用法。
描述:
针对记录计算表达式,返回记录本身。
语法:
r.run(xi,…)
备注:
针对记录r计算表达式x,最后返回记录r。此函数通常用于修改r的字段值,例如x为col1=col2+1, 结果将更改col1的字段值。
参数:
r |
记录。 |
xi |
计算表达式,一般为字段名,或者由字段名组成的合法表达式,"~"表示当前记录。 |
返回值:
经过表达式x运算后的r
示例:
|
A |
|
1 |
=[[12,23]].new(~(1):col1,~(2):col2) |
|
2 |
=A1(1).run(col1=col2+1) |
|
3 |
=A1(1).run(col1=col2+1,col2=col1+col2) |
|
注意:
r.(x)和r.run(x)的区别:r.(x)的目的在于计算x表达式的值,并返回该表达式的值;r.run(x)的目的在于通过x的运算对r做出修改,从而返回修改后的r。
相关概念:
描述:
针对排列中每条记录计算表达式。
语法:
P.run(xi:Fi,…)
备注:
针对排列/序表中每条记录计算表达式xi,结果赋给Fi,返回修改后的P。在表达式计算过程中,如果需要引用P的当前成员,直接使用"~"表示。
参数:
P |
序表/排列。 |
xi |
Fi的字段新值。 |
Fi |
A的字段名。 |
返回值:
示例:
|
A |
|
1 |
=demo.query("select DEPT,NAME,BIRTHDAY from EMPLOYEE") |
|
2 |
=A1.derive(age(BIRTHDAY):Age) |
|
3 |
=A2.run(Age+10:Age) |
|
相关概念:
描述:
针对序列/排列中每个成员计算表达式,返回原序列。
语法:
A.run(x) |
仅计算一个表达式。 |
A.run(x1,x2, ......xi) |
计算多个表达式。 |
备注:
针对序列/排列A中每个成员计算表达式xi,计算过程中可能对A修改,最后返回修改后的A。例如x为col1=col2+1,结果将修改col1字段值。
参数:
A |
序列/排列。 |
x |
计算表达式,一般为字段名,或者由字段名组成的合法表达式,可使用"~"引用当前记录。 |
选项:
@m |
数据量大的复杂运算中并行计算提升性能,计算次序不确定。 |
@z |
逆向计算,仅适用于非纯序列。 |
返回值:
序列/排列
示例:
利用 "run" 修改成员值:
|
A |
|
1 |
=[1,2,3,4,5] |
|
2 |
=A1.run(~=~*~) |
[1,4,9,16,25],"~"引用当前成员 |
利用 " run"函数实现EID和NAME的转换:
|
A |
|
1 |
=demo.query("select * from EMPLOYEE") |
|
2 |
=demo.query("select * from DEPARTMENT") |
|
3 |
=A2.run(MANAGER=A1.select@1(EID==A2.MANAGER).NAME) |
|
4 |
=demo.query("select * from EMPLOYEE") |
|
5 |
=demo.query("select * from DEPARTMENT") |
|
6 |
=A5.run@m(MANAGER=A4.select@1(EID==A5.MANAGER).NAME) |
数据量大的运算中提升性能。 |
利用 "run" 函数实现表间关联:
|
A |
|
1 |
=demo.query("select * from EMPLOYEE").keys(EID) |
|
2 |
=demo.query("select * from DEPARTMENT") |
|
3 |
=A2.run(MANAGER=A1.select@1(EID== A2.MANAGER)) |
|
4 |
=A2.MANAGER.STATE |
California,字段值为记录时,可用点操作符逐级引用。 |
逆向计算:
|
A |
|
1 |
=[1,2,3].run(~=iterate(~~+~)) |
[1,3,6] |
2 |
=[1,2,3].run@z(~=iterate(~~+~)) |
使用@z选项,逆向计算,返回结果:[3,5,6]。 |
注意:
A.(x)和A.run(x)的区别:
A.(x)的目的在于计算x表达式的值,并返回该表达式的值组成的序列;
A.run(x)的目的在于通过x的运算对A做出修改,从而返回修改后的序列/排列A。
相关概念:
描述:
语法:
备注:
管道ch附加计算,对每条记录计算表达式xi,xi值赋给ch的字段Fi,返回原管道ch。
参数:
ch |
管道。 |
xi |
表达式。 |
Fi |
ch的字段名。 |
返回值:
管道
示例:
|
A |
|
1 |
=demo.cursor("select * from EMPLOYEE") |
|
2 |
=channel() |
创建管道。 |
3 |
=A2.run(SALARY+1000:SALARY) |
管道附加计算,将SALARY+1000的计算结果赋给SALARY,返回原管道。 |
4 |
=A2.fetch() |
A2管道执行结果集函数,保留管道当前数据。 |
5 |
=A1.push(A2) |
将游标A1中的数据推送到管道,此时数据不会立即被推送到管道。 |
6 |
=A1.fetch() |
A1游标执行取数动作,此时数据才会被推送到管道,然后管道执行计算并记录结果。 |
7 |
=A2.result() |
获取管道计算结果:
|
描述:
游标中附加计算,给游标字段赋值后返回原游标。
cs.run (xi:Fi,…)
备注:
游标cs中附加计算,对每条记录计算表达式xi,xi值赋给cs的字段Fi,返回原游标cs。支持多路游标。
该函数属于延迟计算函数。
参数:
cs |
游标。 |
xi |
表达式。 |
Fi |
cs的字段名。 |
返回值:
游标
|
A |
|
1 |
=connect("demo").cursor("select EID,NAME,SALARY,HIREDATE,0 as SUBSIDY from EMPLOYEE ") |
返回游标,数据内容如下:
|
2 |
=A1.run(age(HIREDATE):HIREDATE) |
A1游标中附加计算,将age(HIREDATE)的结果值赋给HIREDATE,返回A1游标。 |
3 |
=A1.run((HIREDATE * 2 * SALARY):SUBSIDY) |
A1游标中附加计算,将HIREDATE * 2 * SALARY的结果值赋给SUBSIDY,返回A1游标。 |
4 |
=A1.fetch() |
读取A1游标执行A2、A3计算后的数据(数据量较大时建议分批读取):
|
描述:
语法:
T.run (xi:Fi,…)
备注:
虚表T中定义计算,对T计算表达式xi,结果赋给T的字段Fi,返回新虚表。
参数:
T |
虚表。 |
xi |
表达式。 |
Fi |
T的字段名。 |
虚表
示例:
|
A |
|
1 |
=create(file).record(["emp.ctx"]) |
emp.ctx组表内容如下;
|
2 |
=pseudo(A1) |
生成虚表对象。 |
3 |
=A2.run(SALARY+1000:SALARY) |
A2虚表中定义计算,计算虚表的字段SALARY 增加1000的结果,然后再将结果赋给字段SALARY,返回新虚表。 |
4 |
=A3.import() |
读取A3虚表中的数据,此时A2虚表执行A3中定义的计算,返回内容如下:
|
5 |
=A2.run(if(GENDER=="F",1,2):GENDER) |
A2虚表中定义计算,计算虚表的字段GENDER,如果字段值为F则返回1否则返回2,然后再将结果赋给字段GENDER,返回新虚表。 |
6 |
=A5.import() |
读取A5虚表中的数据,此时A2虚表执行A5中定义的计算,返回内容如下:
|