本章介绍switch()函数的多种用法。
描述:
将编码字段的键值切换为指引记录。
语法:
P.switch(Fi, Ai:x;…)
备注:
将P中外键字段Fi的值切换为Ai的记录,匹配条件为Fi与Ai的x字段值相等,匹配不到的填为null,返回切换后的序表。
比如Attendance表里的employeeID字段,里面可能存的是employeeID的码值,也可能存Employee表的对应记录,此时可以用switch()在两者之间切换。
外键有索引表则用索引,没有则建立索引。
|
P |
序表/排列。 |
|
Fi |
P的外键字段。 |
|
Ai |
序表/排列。 |
|
x |
Ai中与Fi匹配的字段,缺省为Ai的主键。x为#时直接用序号定位,Ai有序号索引时,可省略#。 |
选项:
|
@i |
Fi值匹配不到时删除整条记录。 |
|
@d |
与@i相反,只保留找不到的记录,此时不把Fi填成null。 |
|
@1 |
P中Fi值在Ai中找不到,则在Fi中生成一条Ai结构的记录,主键值设为Fi。 |
序表
示例:
|
|
A |
|
|
1 |
=demo.query("select top 5 * from DEPARTMENT") |
返回序表:
|
|
2 |
=demo.query("select top 10 EID,NAME,DEPT,GENDER from EMPLOYEE") |
返回序表:
|
|
3 |
=A2.switch(DEPT,A1:DEPT) |
A2表的外键DEPT与A1表中的DEPT字段匹配,将键值切换为A1表的指引记录,匹配不到的填入null:
|
参数x省略:
|
|
A |
|
|
1 |
=demo.query("select * from DEPARTMENT").keys(DEPT) |
返回序表,主键为DEPT。 |
|
2 |
=demo.query("select top 10 EID,NAME,DEPT,GENDER from EMPLOYEE") |
返回序表。 |
|
3 |
=A2.switch(DEPT,A1) |
x参数省略,将A2表的外键DEPT与A1表主键匹配,将键值切换为A1表的指引记录:
|
x用序号定位,Ai中有序号索引时:
|
|
A |
|
|
1 |
=connect("demo").query("SELECT * FROM CITIES") |
返回序表:
|
|
2 |
=connect("demo").query("SELECT * FROM STATECAPITAL") |
返回序表: |
|
3 |
=A2.index@n() |
为A2表建立序号索引。 |
|
4 |
=A1.switch(STATEID,A2) |
A1中的CITIES表作为事实表,A3中的STATECAPITAL作为维表; 通过switch()函数执行表关联计算,将CITIES表中的STATEID键值切换为STATECAPITAL的指引记录,计算过程中会使用外键的索引表,此时表达式中可以省略序号键,等同于A1.switch(STATEID,A2:#)。 返回结果如下:
|
使用@i选项:
|
|
A |
|
|
1 |
=demo.query("select * from DEPARTMENT").keys(DEPT) |
返回序表,主键为DEPT。
|
|
2 |
=demo.query("select top 10 EID,NAME,DEPT,GENDER from EMPLOYEE") |
返回序表。 |
|
3 |
=A2.switch(DEPT,A1) |
使用@i选项,A2中DEPT匹配不到时删除整条记录:
|
使用@d选项:
|
|
A |
|
|
1 |
=demo.query("select * from DEPARTMENT").keys(DEPT) |
返回序表,主键为DEPT。
|
|
2 |
=demo.query("select top 10 EID,NAME,DEPT,GENDER from EMPLOYEE") |
返回序表。 |
|
3 |
=A2.switch(DEPT,A1) |
使用@d选项,只返回A2中DEPT匹配不到记录:
|
使用@1选项:
|
|
A |
|
|
1 |
=demo.query("select * from DEPARTMENT").keys(DEPT) |
返回序表,主键为DEPT。
|
|
2 |
=demo.query("select top 10 EID,NAME,DEPT,GENDER from EMPLOYEE") |
返回序表。 |
|
3 |
=A2.switch(DEPT,A1) |
使用@1选项,匹配不到时则在DEPT中生成一条A1结构的记录,记录的主键值为DEPT:
|
描述:
管道中附加指引字段切换动作后返回原管道。
ch.switch(Fi,Ai:x;…)
备注:
管道ch中附加计算,将Fi字段值切换为Ai的记录,返回原管道ch。
x为Ai的主键或逻辑主键,匹配条件为Fi等于x。默认情况下,Fi找不到Ai可匹配的记录时显示为null。
参数:
|
ch |
管道。 |
|
Fi |
ch中的字段。 |
|
Ai |
序表/排列。 |
|
x |
Ai的主键或逻辑主键,如果Ai设置了主键为x,则参数x可以省略。 |
选项:
|
@i |
Fi值匹配不到时删除整条记录。 |
|
@d |
与@i相反,只保留找不到的记录。 |
|
@1 |
ch中某条记录的Fi值在Ai中找不到,则生成一条Ai结构的记录,主键值设为Fi。注意是数字1。 |
返回值:
管道
示例:
x为Ai的主键:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT DEPT,MANAGER FROM DEPARTMENT").keys(DEPT) |
返回DEPT为键的序表:
|
|
3 |
=channel() |
创建管道。 |
|
4 |
=A3.switch(DEPT,A2) |
管道附加计算,将DEPT的字段值切换为指引字段指向A2的记录,DEPT是A2的键,所以参数x可省略,返回到A3管道。 |
|
5 |
=A4.fetch() |
执行结果集函数,保留管道当前数据。 |
|
6 |
=A1.push(A3) |
将A1游标中的数据推送到管道,此时数据不会立即被推送到管道; |
|
7 |
=A1.skip() |
A1游标执行取数动作,此时数据才会被推送到管道,然后管道执行计算并记录结果。 |
|
8 |
=A3.result() |
获取管道计算结果:
|
x非Ai的主键或逻辑主键:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT top 6 DEPT,MANAGER FROM DEPARTMENT") |
返回序表:
|
|
3 |
=channel(A1) |
创建管道并将A1游标中的数据推送到管道,此时数据不会立即被推送到管道。 |
|
4 |
=A3.switch(DEPT,A2:DEPT) |
管道附加计算,将DEPT字段匹配序表A2中对应的DEPT字段值,无法匹配则显示为空,返回到A3管道。 |
|
5 |
=A4.fetch() |
执行结果集函数,保留管道当前数据。 |
|
6 |
=A1.skip() |
A1游标执行取数动作,此时数据才会被推送到管道,然后管道执行计算并记录结果。 |
|
7 |
=A3.result() |
获取管道计算结果:
|
使用@i选项,字段不匹配的记录直接删除:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT top 6 DEPT,MANAGER FROM DEPARTMENT") |
返回序表:
|
|
3 |
=channel(A1) |
创建管道并将A1游标中的数据推送到管道,此时数据不会立即被推送到管道。 |
|
4 |
=A3.switch@i(DEPT,A2:DEPT) |
管道附加,将DEPT字段匹配序表A2中对应的DEPT字段值,使用@i选项,无法匹配则删除整条记录,返回到A3管道。 |
|
5 |
=A4.fetch() |
执行结果集函数,保留管道当前数据。 |
|
6 |
=A1.skip() |
A1游标执行取数动作,此时数据才会被推送到管道,然后管道执行计算并记录结果。 |
|
7 |
=A3.result() |
获取管道计算结果:
|
使用@d选项,与@i相反,只保留匹配不到的记录:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT top 6 DEPT,MANAGER FROM DEPARTMENT") |
返回序表:
|
|
3 |
=channel(A1) |
创建管道并将A1游标中的数据推送到管道,此时数据不会立即被推送到管道。 |
|
4 |
=A3.switch@i(DEPT,A2:DEPT) |
管道附加,将DEPT字段匹配序表A2中对应的DEPT字段值,使用@d选项,只保留匹配不到的记录,返回到A3管道。 |
|
5 |
=A4.fetch() |
执行结果集函数,保留管道当前数据。 |
|
6 |
=A1.skip() |
A1游标执行取数动作,此时数据才会被推送到管道,然后管道执行计算并记录结果。 |
|
7 |
=A3.result() |
获取管道计算结果:
|
使用@1选项:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT top 6 DEPT,MANAGER FROM DEPARTMENT") |
返回序表:
|
|
3 |
=channel(A1) |
创建管道并将A1游标中的数据推送到管道,此时数据不会立即被推送到管道。 |
|
4 |
=A3.switch@i(DEPT,A2:DEPT) |
管道附加,将DEPT字段匹配序表A2中对应的DEPT字段值,使用@1选项,匹配不到时则生成一条A2结构的记录,返回到A3管道。 |
|
5 |
=A4.fetch() |
执行结果集函数,保留管道当前数据。 |
|
6 |
=A1.skip() |
A1游标执行取数动作,此时数据才会被推送到管道,然后管道执行计算并记录结果。 |
|
7 |
=A3.result() |
获取管道计算结果:
|
描述:
语法:
cs.switch(Fi,Ai:x;…)
备注:
游标cs中附加计算,将Fi字段值切换为Ai的记录,返回原游标cs。x为Ai的主键或逻辑主键,匹配条件为Fi等于x;默认情况下,Fi找不到Ai可匹配的记录时显示为null。
该函数属于延迟计算函数。
参数:
|
cs |
游标/多路游标。 |
|
Fi |
cs中的字段。 |
|
Ai |
序表/排列。 |
|
x |
Ai的主键或逻辑主键,如果Ai设置了主键为x,则参数x可以省略。 |
选项:
|
@i |
|
|
@d |
与@i相反,只保留找不到的记录。 |
|
@1 |
cs中某条记录的Fi值在Ai中找不到,则生成一条Ai结构的记录,主键值设为x。注意是数字1。 |
返回值:
游标
示例:
x为Ai的主键:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 5 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT DEPT,MANAGER FROM DEPARTMENT").keys(DEPT) |
返回以DEPT为键的序表:
|
|
3 |
=A1.switch(DEPT,A2) |
游标A1中附加计算,将DEPT的字段值切换为指引字段指向A2的记录,DEPT是A2的键,所以参数x可省略,返回A1游标。 |
|
4 |
=A1.fetch() |
读取游标A1执行A3计算后的数据:
|
x非Ai的主键或逻辑主键:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT top 6 DEPT,MANAGER FROM DEPARTMENT") |
返回序表:
|
|
3 |
=A1.switch(DEPT,A2:DEPT) |
游标A1中附加计算,将DEPT字段匹配序表A2中对应的DEPT字段值,无法匹配则显示为空,返回A1游标。 |
|
4 |
=A1.fetch() |
读取游标A1执行A3计算后的数据:
|
使用@i选项,字段不匹配的记录直接删除:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT top 6 DEPT,MANAGER FROM DEPARTMENT") |
返回序表:
|
|
3 |
=A1.switch@i(DEPT,A2:DEPT) |
游标A1中附加计算,将DEPT字段匹配序表A2中对应的DEPT字段值,使用@i选项,无法匹配则删除整条记录,返回A1游标。 |
|
4 |
=A1.fetch() |
读取游标A1执行A3计算后的数据:
|
使用@d选项,与@i相反,只保留匹配不到的记录:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT top 6 DEPT,MANAGER FROM DEPARTMENT") |
返回序表:
|
|
3 |
=A1.switch@d(DEPT,A2:DEPT) |
游标A1中附加计算,将DEPT字段匹配序表A2中对应的DEPT字段值,使用@d选项,只保留匹配不到的记录,返回A1游标。 |
|
4 |
=A1.fetch() |
读取游标A1执行A3计算后的数据:
|
使用@1选项:
|
|
A |
|
|
1 |
=demo.cursor("SELECT top 10 EID,DEPT,NAME FROM EMPLOYEE") |
返回游标,数据内容如下:
|
|
2 |
=demo.query("SELECT top 6 DEPT,MANAGER FROM DEPARTMENT") |
返回序表:
|
|
3 |
=A1.switch@1(DEPT,A2:DEPT) |
游标A1中附加计算,将DEPT字段匹配序表A2中对应的DEPT字段值,使用@1选项,匹配不到时则生成一条A2结构的记录,返回A1游标。 |
|
4 |
=A1.fetch() |
读取游标A1执行A3计算后的数据:
|
相关概念:
描述:
将集群游标中指定的值字段切换为指引字段。
语法:
cs.switch(Fi,Ai:x;…)
备注:
将游标cs的字段Fi的值切换为Ai的记录,x为Ai的主键或逻辑主键,匹配条件为Fi等于x;默认情况下,Fi找不到Ai可匹配的记录时显示为空。
该函数仅适用于企业版。
参数:
|
cs |
游标、多路游标、集群游标。 |
|
Fi |
cs中的字段。 |
|
Ai |
集群内表。 |
|
x |
Ai的主键或逻辑主键,如果Ai设置了主键为x,则参数x可以省略。 |
选项:
|
@c |
集群表有分布时,计算也均不做跨机引用,认为引用记录总在本机。 |
返回值:
原游标
|
|
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,T’:x;…)
备注:
虚表T中定义计算,将T的字段Fi的值切换为序表/内存虚表T’的记录,返回新虚表。
x为T’的主键,匹配条件为Fi等于x;默认情况下,Fi找不到T’可匹配的记录时显示为null。
参数:
|
T |
虚表。 |
|
Fi |
T中的字段。 |
|
T’ |
序表/内存虚表。 |
|
x |
T’的主键或逻辑主键,如果T’设置了主键为x,则参数x可以省略。 |
选项:
|
@i |
Fi值匹配不到时删除整条记录。 |
|
@d |
与@i相反,只保留找不到的记录。 |
|
@1 |
T中某条记录的F值在T’中找不到,则生成一条T’结构的记录,主键值设为x。 |
返回值:
虚表
示例:
|
|
A |
B |
|
|
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) |
=A4.import() |
执行A4格中的表达式,对虚表A2定义计算,将虚表中DEPT字段值转成序表A3中的指引字段,返回成新虚表。 执行B4格中的表达式,读取A4虚表中的数据,此时A2虚表执行A4中定义的计算操作,返回内容如下:
|
|
5 |
=A2.switch@i(DEPT,A3) |
=A5.import() |
使用@i选项,删除掉匹配不上的记录,B5执行计算后返回结果如下:
|
|
6 |
=A2.switch@d(DEPT,A3) |
=A6.cursor().fetch() |
使用@d选项,虚表中只保留匹配不上的记录,B6执行计算后返回结果如下:
|
|
7 |
=A7.cursor().fetch() |
使用@1选项,虚表中的DEPT值在序表A3中找不到时,生成一条A3结构的记录,主键值设为DEPT,B7执行计算后返回结果如下:
|
|
|
8 |
=pseudo([{file:"dmp.btx",key:"keys(DEPT)"}]) |
|
使用集文件定义内存虚表,DEPT为主键,数据内容如下:
|
|
9 |
=A2.switch(DEPT,A8) |
=A9.import() |
返回结果同B4。 |