本章介绍switch()函数的多种用法。
描述:
编码字段的键值和指引记录之间切换。
语法:
P.switch(Fi, Ai:x;…)
备注:
Fi在键值和Ai的指引记录之间切换,键值为Ai指引记录的主键,返回切换后的序表。
比如Attendance表里的employeeID字段,里面可能存的是employeeID的码值,也可能存Employee表的对应记录,此时可以用switch()在两者之间切换。
外键有索引表则用索引,没有则建立自行管理。
参数:
P |
序表/排列。 |
Fi |
P的键,当只有Fi参数时,Fi存的是码表Ai的记录。通过switch函数切换成码值。 |
Fi, Ai |
当存在参数Ai时,Fi为P的编码字段,存的是码值。通过switch函数切换成Ai的记录。找不到填为null。匹配条件为Fi和Ai的主键相等。 |
Fi, Ai:x |
当存在参数Ai和主键x时,表示从Ai中选出第一条x值和Fi相同的记录,放到字段Fi中,特别地,x为#时直接用序号定位。 |
选项: (对Fi, Ai 和Fi, Ai:x有效)
@i |
过程中找不到任何F对应值则删除该记录。 |
@d |
与@i相反,只保留找不到的记录,此时不把F填成null。 |
@1 |
P中某条记录的F值在B中找不到,则生成一条B结构的记录,主键值设为F。 |
返回值:
序表
示例:
|
A |
|
1 |
=demo.query("select * from DEPARTMENT").keys(DEPT) |
|
2 |
=demo.query("select * from EMPLOYEE where EID < 10") |
|
3 |
=demo.query("select * from DEPARTMENT" ).cursor().memory().keys(DEPT) |
返回内表 |
4 |
>A2.switch(DEPT,A1:DEPT) |
|
5 |
>A2.switch(DEPT,A3:DEPT) |
A3为内表,同上 |
6 |
>A2.switch(DEPT) |
把A2中"DEPT"字段对应的序表的记录转换为字段值 |
7 |
>A2.switch@i(DEPT,A1) |
找不到任何DEPT对应值则删除该记录 |
8 |
>A2.switch@d(DEPT,A1) |
只保留找不到任何DEPT对应值的记录 |
9 |
>A1.delete(6) |
|
10 |
=A2.switch(DEPT,A2:DEPT) |
|
11 |
=A2.switch@1(DEPT,A2:DEPT) |
|
相关概念:
描述:
切换管道中编码字段的键值与指引记录
语法:
ch.switch(Fi,Ai:x;…)
备注:
Fi在键值和Ai的指引记录之间切换,键值为Ai指引记录的主键。
参数:
ch |
管道 |
Fi |
A的编码字段,当只有Fi参数时,Fi存的是码表Ai的记录。通过switch函数切换成码值。 |
Fi, Ai |
当存在参数Ai时,Fi为A的编码字段,存的是码值。通过switch函数切换成Ai的记录。匹配条件为Fi和Ai的主键相等 |
Fi, Ai:x |
当参数存在Ai和x时,表示从Ai中选出第一条x值和Fi相同的记录,放到字段Fi中 |
选项:
@i |
过程中找不到任何F对应值则删除该记录。 |
@d |
与@i相反,只保留找不到的记录 |
@1 |
ch中某条记录的F值在Ai中找不到,则生成一条Ai结构的记录,主键值设为x |
返回值:
管道
示例:
|
A |
|
1 |
=demo.cursor("select EID,SURNAME,DEPT,STATE from EMPLOYEE") |
|
2 |
=demo.query("select STATEID,NAME from STATES").keys(STATEID) |
|
3 |
=channel() |
创建管道 |
4 |
=A1.push(A3) |
将游标A1中的数据推送到管道A3 |
5 |
=A3.switch(STATE,A2:NAME) |
从A2表中选出第一条NAME键值与管道中STATE键值相同的记录作为指引记录,替换管道中的STATE,切换后的键值为指引字段的主键,即STATEID |
6 |
=A5.fetch() |
A3管道附加结果集函数ch.fetch(),保留管道当前数据 |
7 |
=A1.fetch() |
从A1游标中取数 |
8 |
=A3.result() |
把A1中"STATE"字段值转成对应的A2中的记录。 |
9 |
=demo.cursor("select EID,SURNAME,DEPT,STATE from EMPLOYEE where EID<20") |
返回游标 |
10 |
=demo.query("select STATEID,NAME from STATES where STATEID<15").keys(NAME) |
返回主键为NAME的序表 |
11 |
=channel(A9) |
创建游标并将A9游标中的记录推送到管道,此时数据不会立即被推送到管道中 |
12 |
=A11.switch(STATE,A10) |
参数x缺省用A10的主键,切换后的键值为NAME |
13 |
=A12.fetch() |
|
14 |
=A9.skip() |
|
15 |
=A11.result() |
|
16 |
=demo.cursor("select EID,SURNAME,DEPT,STATE from EMPLOYEE where EID<20") |
|
17 |
=demo.query("select STATEID,NAME from STATES where STATEID<15").keys(NAME) |
同A10 |
18 |
=channel() |
创建管道 |
19 |
=A18.switch@i(STATE,A17) |
使用@i选项,在A17序表中找不到与STATE对应的值时,删除该条记录 |
20 |
=A18.fetch() |
|
21 |
=A16.push(A18) |
将游标中的数据推送到管道 |
22 |
=A18.result() |
获取管道中的数据 |
23 |
=demo.cursor("select EID,SURNAME,DEPT,STATE from EMPLOYEE where EID<20") |
|
24 |
=demo.query("select STATEID,NAME from STATES where STATEID<15").keys(STATEID) |
同A2 |
25 |
=channel() |
创建管道 |
26 |
=A25.switch@1(STATE,A24:NAME) |
从A24表中选出第一条NAME键值与管道中STATE键值相同的记录作为指引记录,替换管道中的STATE,切换后的键值为指引字段的主键,即STATEID;若没有找到匹配的STATEID,则生成一条A24结构的记录,主键设为NAME |
27 |
=A25.fetch() |
|
28 |
=A23.push(A25) |
将游标中的数据推送到管道 |
29 |
=A25.result() |
获取管道中的数据 |
描述:
将游标中指定的值字段切换为指引字段
语法:
cs.switch(Fi,Ai:x;…)
备注:
将游标cs的字段Fi的值切换为Ai的记录,x为Ai的主键或逻辑主键,匹配条件为Fi等于x;默认情况下,Fi找不到Ai可匹配的记录时显示为空。
参数:
cs |
游标、多路游标 |
Fi |
cs中的字段 |
Ai |
序表/排列 |
x |
Ai的主键或逻辑主键,如果Ai设置了主键为x,则参数x可以省略 |
选项:
@i |
|
@d |
与@i相反,只保留找不到的记录 |
@1 |
cs中某条记录的F值在Ai中找不到,则生成一条Ai结构的记录,主键值设为x |
返回值:
原游标cs
示例:
|
A |
|
1 |
=demo.cursor("SELECT EMPLOYEE.EID,EMPLOYEE.DEPT,EMPLOYEE.NAME, EMPLOYEE.SALARY FROM EMPLOYEE where EID<11") |
返回取数游标,游标中的数据如下: |
2 |
=demo.query("SELECT * FROM DEPARTMENT").keys(DEPT) |
返回序表,并设置字段DEPT为序表的键:
|
3 |
=A1.switch(DEPT,A2) |
DEPT是A2序表的键,所以参数x可省略。 |
4 |
=A3.fetch() |
把A1中"DEPT"字段值转成对应的A2中的指引字段。 例如点击第一行中的R&D,则显示下面的记录: |
5 |
=demo.cursor("SELECT EMPLOYEE.EID,EMPLOYEE.DEPT,EMPLOYEE.NAME,EMPLOYEE.SALARY FROM EMPLOYEE where EID<11") |
返回取数游标,游标中的数据如下: |
6 |
=demo.query("SELECT * FROM DEPARTMENT where MANAGER<5") |
返回序表,结果如下: |
7 |
=A5.switch(DEPT,A6:DEPT) |
将F匹配序表中对应的字段值,有部分的记录中,F找不到对应的值,则显示为空 |
8 |
=A7.fetch() |
|
9 |
=demo.cursor("SELECT EMPLOYEE.EID,EMPLOYEE.DEPT,EMPLOYEE.NAME,EMPLOYEE.SALARY FROM EMPLOYEE where EID<11") |
同A5 |
10 |
=demo.query("SELECT * FROM DEPARTMENT where MANAGER<5") |
同A6 |
11 |
=A9.switch@i(DEPT,A10:DEPT) |
使用@i选项表示找不到任何F对应值则删除该记录 |
12 |
=A11.fetch() |
|
13 |
=demo.cursor("SELECT EMPLOYEE.EID,EMPLOYEE.DEPT,EMPLOYEE.NAME,EMPLOYEE.SALARY FROM EMPLOYEE where EID<11") |
同A5 |
14 |
=demo.query("SELECT * FROM DEPARTMENT where MANAGER<5") |
同A6 |
15 |
=A13.switch@d(DEPT,A14:DEPT) |
@d选项与@i相反,只保留找不到的记录 |
16 |
=A15.fetch() |
|
17 |
=demo.cursor("SELECT EMPLOYEE.EID,EMPLOYEE.DEPT,EMPLOYEE.NAME,EMPLOYEE.SALARY FROM EMPLOYEE where EID<11") |
同A5 |
18 |
=demo.query("SELECT * FROM DEPARTMENT where MANAGER<5") |
同A6 |
19 |
=A17.switch@1(DEPT,A18:DEPT) |
使用@1选项,A17的某些DEPT值在A18中找不到,此时生成一条A18结构的记录,主键值设为DEPT |
20 |
=A19.fetch() |
|
相关概念:
描述:
将集群游标中指定的值字段切换为指引字段
语法:
cs.switch(Fi,Ai:x;…)
备注:
将游标cs的字段Fi的值切换为Ai的记录,x为Ai的主键或逻辑主键,匹配条件为Fi等于x;默认情况下,Fi找不到Ai可匹配的记录时显示为空。
参数:
cs |
游标、多路游标、集群游标 |
Fi |
cs中的字段 |
Ai |
集群内表 |
x |
Ai的主键或逻辑主键,如果Ai设置了主键为x,则参数x可以省略 |
选项:
@c |
集群表有分布时,计算也均不做跨机引用,认为引用记录总在本机 |
返回值:
原游标cs
示例:
|
A |
|
1 |
=demo.cursor("SELECT * FROM DEPARTMENT") |
返回游标 |
2 |
[192.168.0.110:8281,192.168.18.143:8281] |
|
3 |
=file("emp_1.ctx":[1,2], A2) |
|
4 |
=A3.open() |
打开集群组表 |
5 |
=A4.cursor() |
返回集群游标 |
6 |
=A5.groups@c(DEPT:dept;sum(SALARY):totalSalary) |
返回集群内表 |
7 |
=A1.switch@c(DEPT,A6:dept) |
将游标中的DEPT字段切换为指引字段,返回原游标 |
8 |
=A7.fetch() |
取游标中的数据: |
描述:
语法:
T.switch(Fi,Ai:x;…)
备注:
将虚表T的字段Fi的值切换为Ai的记录,x为Ai的主键或逻辑主键,匹配条件为Fi等于x;默认情况下,Fi找不到Ai可匹配的记录时显示为空。
参数:
T |
虚表 |
Fi |
T中的字段 |
Ai |
序表/排列 |
x |
Ai的主键或逻辑主键,如果Ai设置了主键为x,则参数x可以省略 |
选项:
@i |
过程中找不到任何F对应值则删除该记录 |
@d |
与@i相反,只保留找不到的记录 |
@1 |
T中某条记录的F值在Ai中找不到,则生成一条Ai结构的记录,主键值设为x |
返回值:
虚表
示例:
|
A |
|
1 |
=create(file).record(["emp_news.ctx"]) |
emp_news.ctx组表内容如下: |
2 |
=pseudo(A1) |
由组表产生虚表 |
3 |
=demo.query("SELECT top 4 * FROM DEPARTMENT").keys(DEPT) |
返回序表,并设置字段DEPT为序表的键:
|
4 |
=A2.switch(DEPT,A3) |
把虚表中DEPT字段值转成序表A3中的指引字段,返回虚表内容如下: |
5 |
=A2.switch@i(DEPT,A3) |
使用@i选项,删除掉匹配不上的记录 |
6 |
=A2.switch@d(DEPT,A3) |
使用@d选项,虚表中只保留匹配不上的记录 |
7 |
=A2.switch@1(DEPT,A3) |
使用@1选项,虚表中的DEPT值在序表A3中找不到时,生成一条A3结构的记录,主键值设为DEPT |