在实际应用需求中,用户经常有这样的需求:
假定结果集R的下标"Code"列里存贮了代码,我们还有一个代码数组CodeArr,有时候,我们希望得到R的结果集内所有Code列包含在代码数组CodeArr中的子集,有时候希望得到R的结果集内所有Code列不包含在代码数组CodeArr中的子集。读起来似乎有点拗口,但是相信大家很清楚我们描述的是什么。
假定R的内容为
Code V1 V2
0001 8.9 12
0002 9 10
0003 8 8
0004 1 2
假定CodeArr的内容为一维数组array("0001","0003")
FilterIn取包含的子集
R1:=FilterIn (R,CodeArr,"Code")
结果集R1为
Code V1 V2
0001 8.9 12
0003 8 8
FilterNotIn取不包含的子集
R1:=FilterNotIn (R,CodeArr,"Code")
结果集R2为
Code V1 V2
0002 9 10
0004 1 2
返回结果集过滤的行标
上面我们的应用可以返回子结果集,但是往往用户有时需要的只要结果集的行标就可以了,因为我们可能会继续使用返回的行标,例如利用这个行标处理其他结果集。
FilterIn以及FilterNotIn均支持返回下标的功能。
上述的范例中,如果我们使用FilterIn(R,CodeArr,"Code",false),返回的结果就只有下标了,结果为array(0,2),代表下标0和下标2符合过滤条件,而使用FilterNotIn(R,CodeArr,"Code",false)的结果则为array(1,3)。
从上边的范例我们知道FilterIn/FilterNotIn的定义为:
FilterIn/FilterNotIn(R,FilterArray,Field,bReturnSubResult)
其中参数对应的含义为:结果集,过滤值数组,列标,是否返回子结果集;最后一个参数可以省略,缺省为真。
不是题外的题外话,过滤后取子结果集:
TSL的子矩阵功能可以直接利用FilterIn/FilterNotIn返回的行标数组来获取子矩阵。
R[array(1,3)]的结果就是R的行标为1和3的子结果集,假使用户只需要取V1列,那么用户使用R[array(1,3),"V1"]可以返回V1列的结果集(类型为一维的数组)。
在实际使用中,用户可能需要的是,如果用户要返回的是二维的多列结果集,例如,用户希望返回符合条件的某些特定列,我们怎么做呢?
这很像是一个SELECT的操作,我们假定R的列还有V3,V4,V5...列,我们希望取出符合结果的Code,V1,V2列:
SubIndex:=FilterIn(R,CodeArr,"Code",false);
SubResult:=R[SubIndex,array("Code","V1","V2")];