本章介绍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中定义的计算,返回内容如下: 
 |