本章介绍new()函数的多种用法。
描述:
生成一条记录
语法:
new(xi:Fi,…)
备注:
生成一条字段名称为Fi字段值为xi的记录。
参数:
xi |
字段值 |
Fi |
字段名称 |
选项:
@t |
返回成序表 |
返回值:
记录或序表
示例:
|
A |
|
1 |
=new(1:ID,"ZHS":name) |
生成一条记录 |
2 |
=new@t(1:ID,"ZHS":name) |
使用@t选项,生成只有一条记录的序表 |
描述:
计算序表/排列字段值生成新序表/排列。
语法:
A.new(xi:Fi,…)
备注:
根据序表/排列A的长度,生成一个记录数与A相同,且每条记录的字段值为xi、字段名为Fi的新序表/排列。
参数:
Fi |
字段名,省略则用xi中解析出的标识符 |
xi |
表达式,结果为字段值,省略则为null,省略xi时,不能省略: Fi。用#时表示用序号定位,此时使用原列名 |
A |
序表/排列 |
选项:
@m |
数据量大的复杂运算中,并行计算提升性能,计算次序不确定。 |
@i |
有xi并且计算结果为空时,不生成该行记录。 |
@o |
A是纯序表时,未改变的旧列直接引用,不再新产生 |
返回值:
新的序表
示例:
Ø 从单个序表产生
|
A |
|
1 |
=demo.query("select EID,NAME,DEPT,BIRTHDAY from EMPLOYEE") |
|
2 |
=A1.new(EID:EmployeeID,NAME, #3:dept) |
直接产生新序表,如与A1字段名相同,可以省略Fi |
3 |
=A1.new(NAME,age(BIRTHDAY):AGE) |
计算字段值生成新序表 |
4 |
=A1.new@m(NAME,age(BIRTHDAY):AGE) |
数据量大时提升性能 |
5 |
=file("D:\\txt_files\\data1.txt").import@t() |
data1.txt中内容如下: |
6 |
=A5.new@i(CLASS,STUDENTID,SUBJECT,SCORE:score) |
SCORE计算结果为空时,对应的该条记录不生成 |
Ø A为纯序表时
|
A |
|
1 |
=demo.query("select EID,NAME,DEPT,BIRTHDAY from EMPLOYEE").i() |
返回纯序表 |
2 |
=A1.new@o(EID,NAME, #3:dept) |
使用@o选项,未改变的旧列直接引用,不再新产生 |
3 |
=A2(1).NAME="aaa" |
修改列值时会同时修改源表的,执行后A2格结果如下: 此时A1格结果如下: |
Ø 从同序的多个序表关联运算产生
|
A |
|
1 |
=create(Name,Chinese).record(["Jack",99,"Lucy",90]) |
|
2 |
=create(Name,Math).record(["Jack",89,"Lucy",96]) |
|
3 |
=A1.new(Name:Name,Chinese:Chinese,A2(#).Math:Math) |
通过A2(#)读取A2同位置的记录 |
相关概念:
描述:
计算管道内记录的字段值并返回原管道
语法:
ch.new(xi:Fi,…)
备注:
针对管道ch的每条记录计算xi,并且把计算后的字段名重命名为Fi,最后返回由Fi组成的原管道ch。
参数:
ch |
管道 |
xi |
表达式,结果为字段值,省略则为null,省略xi时,不能省略: Fi。用#时表示用序号定位。 |
Fi |
ch的字段名,省略则用xi中解析出的标识符 |
选项:
@i |
有xi并且计算结果为空时,不生成该行记录。 |
返回值:
管道ch
示例:
|
A |
|
1 |
=demo.cursor("select * from SCORES") |
创建游标 |
2 |
=file("D:\\txt_files\\data1.txt").cursor@t() |
data1.txt中内容如下: |
3 |
=channel() |
创建管道 |
4 |
=channel() |
创建管道 |
5 |
=A3.new(CLASS,#2:ID,SCORE+5:newScores) |
管道A3变为由CLASS、ID和newScores 组成,并且对原有的SCORE执行表达式计算。 |
6 |
=A3.fetch() |
保留管道当前数据 |
7 |
=A4.new@i(CLASS,STUDENTID,SUBJECT,SCORE:score) |
SCORE计算结果为空时,对应的该条记录不生成 |
8 |
=A4.fetch() |
|
9 |
=A1.push(A3) |
将游标A1中的数据推送到管道A3,此时数据不会立即被推送到管道。 |
10 |
=A2.push(A4) |
将游标A2中的数据推送到管道A4 |
11 |
=A1.fetch() |
A1执行fetch()时程序才会执行管道中的计算,游标中的数据才真正被推送到管道。 |
12 |
=A3.result() |
|
13 |
=A2.fetch() |
|
14 |
=A4.result() |
|
描述:
计算游标字段值并返回原游标
语法:
cs.new(xi:Fi,…)
备注:
针对游标cs的每条记录计算xi,并且把计算后的字段名重命名为Fi,最后返回由Fi组成的原游标cs。
参数:
cs |
游标 |
xi |
表达式,结果为字段值,省略则为null,省略xi时,不能省略: Fi。用#时表示用序号定位。 |
Fi |
cs的字段名,省略则用xi中解析出的标识符 |
选项:
@i |
有xi并且计算结果为空时,不生成该行记录。 |
返回值:
游标cs
示例:
|
A |
|
1 |
=connect("demo").cursor("select * from SCORES where SCORE<60") |
|
2 |
=A1.new(#2:ID,CLASS,SCORE+5:newScores) |
游标A1变为由ID、CLASS和newScores组成,并且对原有的SCORE执行表达式计算。 |
3 |
=A2.fetch() |
|
4 |
data1.txt中内容如下: |
|
5 |
=A4.new@i(CLASS,STUDENTID,SUBJECT,SCORE:score) |
SCORE计算结果为空时,对应的该条记录不生成 |
6 |
=A5.fetch() |
|
描述:
根据组表的键值与序表字段对应,取出组表字段,结果返回序表/游标。
语法:
T.new(A/cs:K,x:C,…;wi,...)
备注:
T和序表A/游标cs是一对多关系,按T的键/维字段与序表A/游标cs(从头开始)的字段对应后返回T的记录,已知序表A/游标cs前面字段与T的键值字段同序;A时返回序表,cs时返回游标/多路游标。
当没有@r选项时,支持聚合运算,T必须为主表,A/cs必须为子表,对子表字段做聚合。
参数:
T |
组表 |
A/cs |
序表/游标 |
K |
字段名,A/cs后有K…参数时,则用这些字段来对应 |
x |
字段值 |
C |
列别名,可省略 |
wi |
过滤条件,多个过滤条件间用逗号间隔,且条件间为AND关系 |
选项:
@r |
复制主表记录,返回结果集按A/cs对齐 |
返回值:
序表/游标
示例:
|
A |
|
1 |
=file("D:/Employee.ctx").open() |
打开组表 |
2 |
=demo.query("select SALARY,NAME,EID from EMPLOYEE order by EID") |
结果返回根据EID升序排列的序表 |
3 |
=A1.new(A2:EID,NAME,GENDER) |
通过序表的EID与组表主键对应,取出组表字段 |
4 |
=demo.cursor("select * from EMPLOYEE order by EID") |
|
5 |
=A1.new(A4,NAME:EMPName,GENDER:EMPGender).fetch() |
通过游标的第一个字段与组表主键对应,取出组表的其他字段 |
6 |
=demo.query("select EID from employee where EID<10 ") |
|
7 |
=A1.new(A6,EID,GENDER,SALARY;GENDER=="F",SALARY>2000) |
通过序表的第一个字段与组表主键对应,从组表中取出Gender为"F"并且SALARY大于2000的字段 |
8 |
=file("D:/pdm/sale.ctx").open() |
组表内容如下:
|
9 |
=demo.query("select 订单ID as ID,数量 as amount from 订单明细 where 订单ID<10251") |
|
10 |
=A8.new(A9,ID,(sum(AMOUNT)):TOTAL) |
对子表字段值聚合: |
11 |
=A8.new@r(A9,ID,AMOUNT,PRICE) |
使用@r选项,按A9对齐,复制主表A8记录: |
描述:
根据键值取出集群组表中的指定字段,并返回集群多路游标。
语法:
T.new(A/cs,x:C,…;wi,...)
备注:
根据集群内表A或者集群游标cs的键值,从集群组表T中取出指定的字段x,...,要求A/cs对键有序。
参数:
T |
集群组表 |
A/cs |
集群内表/集群游标 |
x |
字段值 |
C |
列别名 |
wi |
过滤条件,多个过滤条件间用逗号间隔,之间为AND关系 |
返回值:
集群多路游标
示例:
|
A |
|
1 |
=file("emp10.ctx",["192.168.0.118:8281"]) |
|
2 |
=A1.open() |
打开集群组表 |
3 |
=file("emp11.ctx",["192.168.0.119:8281"]).open().memory() |
打开集群内表 |
4 |
=A2.new(A3,NAME,GENDER).fetch() |
通过内表键值取出集群表中的指定字段 |
5 |
=file("emp12.ctx",["192.168.0.110:8281"]).open().cursor() |
返回集群游标 |
6 |
=A2.new(A5,NAME:NAME,GENDER:GENDER).fetch() |
通过游标键值取出集群表中的指定字段 |