select()

阅读(3853) 标签: select,

本章介绍select()的多种用法。

A.select()

描述:

选出序列中符合条件的成员。

语法:

A.select( x )

 

A.select(x1:y1, x2:y2, ......xi:yi)

多个条件时用&&组合查询的简化写法,相当于A.select(x1== y1 && x2== y2 &&...... xi==yi)

备注:

针对序列A的每个成员计算表达式x,返回使表达式的值为真的成员组成的新序列。参数省略时返回所有成员。

注意,当序列中的列名与单元格格名冲突时,表达式中引用列名时需要加上序列名称作为前缀。

选项:

@1

返回第一个成员

@z

从后往前查找

@b

使用二分法查询,要求A必须是升序序列,并且参数必须是使用冒号分割符或者是返回数值的表达式,数值表达式结果为0则表示找到。

@m

数据量大的复杂运算中并行计算提升性能,计算次序不确定,与@1bz选项互斥。

@t

A是序表且返回值为空时,返回一个保留数据结构的空序表

@c

从第一个成员往后取,到第一个不满足条件的成员停止

@r

从前往后查找第一个满足条件的成员,然后从这个成员一直取到序列的最后一个成员

@v

A是纯序表时,返回成纯序表,该选项缺省时返回纯序列

参数:

A

序列

x

布尔表达式,可为null

xi:yi

xi 为表达式,yi为比较值

返回值:

序列/序表

示例:

 

A

 

1

[2,5,4,3,2,1,4,1,3]

 

2

=A1.select(~>3)

[5,4,4]

3

=A1.select@1(~>3)

5,返回符合条件的第一个成员

4

=demo.query("select  EID,NAME,GENDER,DEPT,SALARY from EMPLOYEE order by EID")

 

5

=A4.select(GENDER:"F",SALARY:7000)

多条件查询

6

=A4.select@t(EID==2000)

返回一个保留数据结构的空序表

 

指定查询方向

 

A

 

1

[2,5,4,3,2,1,4,1,3]

 

2

=A1.select(~>3)

[5,4,4]

3

=A1.select@z(~>3)

从后往前查,[4,4,5]

4

[8,10,3,5,7,9,11,13,7]

 

5

=A4.select@c(~>7)

[8,10],从第一个成员往后取,到第一个不满足条件的成员停止

6

=A4.select@zc(~>6)

[7,13,11,9,7],从最后一个成员往前取,到第一个不符合条件的成员停止

7

=A4.select@r(~>10)

[11,13,7],从前往后查找第一个满足条件的成员,然后从这个成员一直取到最后

 

高效率筛选

 

A

 

1

=demo.query("select EID,NAME,GENDER,DEPT,BIRTHDAY from employee")

 

2

=A1.select@m(GENDER=="F")

使用@m选项,数据量大时使用并行计算,提升性能

3

=A1.sort(GENDER).select@b(GENDER:"F")

A1根据GENDER升序排序,此时可使用二分法查询,表达式中使用冒号,查询GENDER值为F的数据

4

=A1.sort(EID).select@b(EID-10)

A1根据EID升序排序,此时可使用二分法查询,参数使用返回数值的表达式,查询EID10的数据

 

列名与格名冲突的情况

 

A

 

1

=to(3).new(~:ID,~*~:A1)

2

=A1.select(A1.A1==4)

当列名与格名冲突时,表达式中引用列名需要加上序列名称作为前缀

 

返回纯序表   

 

A

 

1

=demo.query("select EID,NAME,GENDER,DEPT,BIRTHDAY from employee").keys(EID)

 

2

=A1.i()

将序表A1转换为纯序表

3

=A2.select(GENDER=="M")

返回结果类型为纯序列

4

=A2.select@v(GENDER=="F")

使用@v选项,返回结果类型为纯序表

 

相关概念:

A.pselect()

T.select@i()

描述:

选出序表中符合条件的成员。

语法:

T.select@i( x )

 

备注:

针对序表T的每个成员计算表达式x,返回符合过滤条件的成员组成的新序表。

T为建立索引的序表,使用T.select@i()时会复用T的索引,结果集次序可能会被打乱。

参数省略时返回所有成员。

参数:

T

建立了索引的序表

x

过滤条件,可为null

返回值:

序表

示例:

 

A

 

1

=demo.query("select * from DEPT").keys@i(DEPTID)

返回键为DEPTID的序表,并创建哈希索引

2

=A1.select@i(FATHER==12)

复用A1创建的索引,返回A1序表中FATHER12的记录

T.select()

描述:

选出虚表中符合条件的记录

语法:

T.select( x )

 

备注:

针对虚表T中每条记录计算表达式x,返回使表达式x的值为真的虚表。参数x省略时返回所有记录组成的虚表。

参数:

T

虚表

x

布尔表达式,过滤条件,可为null

返回值:

虚表对象

示例:

 

A

 

1

=create(file).record(["D:/file/pseudo/app.ctx"])

组表app.ctx数据内容如下:

2

=pseudo(A1)

 

生成虚表对象

3

=A2.select(eid>7)

筛选出eid>7的记录,返回虚表对象

4

=A3.import()

从虚表对象A3中取出序表

5

=A2.select()

返回所有记录组成的虚表

6

=A5.import()

从虚表对象A5中取出序表

 

T.select(x;f)

描述:

把虚表中不满足条件的记录写入集文件

语法:

T.select(x;f)

备注:

针对虚表T中每条记录计算表达式x,把表达式x的值为假的记录写入集文件f中。返回使表达式x的值为真的虚表。

参数:

T

虚表

x

布尔表达式

f

集文件

返回值:

  虚表

示例:

 

A

 

1

=create(file).record(["EMPLOYEE.ctx"])

 

2

=pseudo(A1)

由组表生成虚表

3

=file("emp_NOTHR.btx")

 

4

=A2.select(DEPT=="HR";A3)

将不满足DEPT=="HR"的记录写入主目录下的集文件emp_NOTHR.btx

5

=A4.import()

返回虚表内容如下:

 

ch.select()

描述:

返回筛选后的原管道

语法:

ch.select(x)

备注:

针对管道ch中每条记录计算表达式x,返回使表达式x的值为真的原管道。参数省略时返回所有记录组成的原管道。

该函数为附加计算动作

参数:

ch

管道

x

布尔表达式

返回值:

原管道ch

示例:

 

A

 

1

=demo.cursor("select * from SALES")

 

2

=channel()

创建管道

3

=A2.select(ORDERID>100)

给管道附加ch.select()计算动作,筛选ORDERID>100的数据返回成原管道

4

=A2.fetch()

保留管道当前数据

5

=A1.push(A2)

将游标A1中的数据推送到管道,此时数据不会立即被推送到管道。

6

=A1.fetch()

A1游标执行fetch取数,此时程序才会执行管道中的计算,游标中的数据才真正被推送到管道。

7

=A2.result()

获取管道计算结果

ch.select(x,ch’)

描述:

把管道中不满足条件的记录推送到另一个管道

语法:

ch.select(x,ch’)

备注:

针对管道ch中每条记录计算表达式x,把表达式x的值为假的记录推送到管道ch’中。

参数:

ch

管道

x

布尔表达式

ch’

管道

返回值:

管道ch

示例:

 

A

 

1

=demo.cursor("select EID,NAME,SALARY from EMPLOYEE " )

 

2

=channel()

创建管道

3

=channel()

创建管道

4

=A1.push(A2)

将游标A1中的数据推送到管道A2

5

=A2.select(EID<5,A3)

将管道A2中不满足EID<5的数据推送到管道A3

6

=A2.fetch()

A2管道附加结果集函数ch.fetch(),保留管道当前数据

7

=A3.fetch()

A3管道附加结果集函数ch.fetch(),保留管道当前数据

8

=A1.skip()

游标A1执行取数时程序才会执行管道中的计算,游标中的数据才真正被推送到管道

9

=A2.result()

获取管道A2的计算结果

10

=A3.result()

获取管道A3的计算结果

cs.select()

描述:

筛选游标中满足条件的记录

语法:

cs.select(x)

备注:

针对游标cs中每条记录计算表达式x,返回使表达式x的值为真的原游标。

参数x省略时返回所有记录组成的原游标。支持多路游标。

参数:

cs

游标

x

布尔表达式

返回值:

原游标cs

示例:

 

A

 

1

=demo.cursor("select * from SCORES")

 

2

=A1.select(STUDENTID>10)

筛选STUDENTID大于10的学生成绩信息

3

=A2.fetch()

cs.select(x,ch’)

描述:

把游标中不满足条件的记录推送到管道

语法:

cs.select(x,ch’)

备注:

针对游标cs中每条记录计算表达式x,把表达式x的值为假的记录推送到管道ch’中。

参数:

cs

游标

x

布尔表达式

ch’

管道

返回值:

管道ch

示例:

 

A

 

1

=demo.cursor("select EID,NAME,SALARY from EMPLOYEE" )

 

2

=channel()

创建管道

3

=A1.select(EID<5,A2)

将游标A1中不满足条件EID<5的数据推送到管道

4

=A2.fetch()

保留管道当前数据

5

=A1.fetch()

获取筛选后的游标中的数据

6

=A2.result()

获取管道计算结果

 

cs.select(x;f)

描述:

把游标中不满足条件的记录写入集文件

语法:

cs.select(x;f)

备注:

针对游标cs中每条记录计算表达式x,把表达式x的值为假的记录写入集文件f中。结果返回使表达式x的值为真的原游标。

参数:

cs

游标

x

布尔表达式

f

集文件

返回值:

  原游标cs

示例:

 

A

 

1

=demo.cursor("select * from dept")

 

2

=file("dept.btx")

 

3

=A1.select(DEPTID<5;A2)

将不满足DEPTID <5的记录写入主目录下的集文件dept.btx

4

=A3.fetch()