指定SELECT的选项,控制SELECT的行为, Options 为以下数值的组合(以下数值的_XOR或者相加)
下表中二进制位从0开始,可通过2^N(2的N次方)形式获取该位设置的值。
同时设置多模式时,可通过相加方式得到,比如设置selectopt的值为2^6+2^8,则表示在使用MovingFirst模式的同时设置refof越界时返回nil而非0(可参考下面示例03)。
| 选项名 | 二进制位 | 值 | 含义
|
|---|
| SELECT_OPT_SINGLEV | 0 | 1 | 返回为单个值,与VSelect同
|
| SELECT_OPT_SINGLEARRAY | 1 | 2 | 返回为一维数组,与SSelect同
|
| SELECT_OPT_MATRIX | 2 | 4 | 返回为Matrix类型,与MSelect同
|
| SELECT_OPT_PACKED | 3 | 8 | 返回的行列下标为增长的数字
|
| SELECT_OPT_MULTIAGGSAMENAME | 4 | 16 | 当采用SUMOF( * )这种模式的时候,每个字段的聚集的名保持和字段一致
|
| SELECT_OPT_AGGSAMENAME | 5 | 32 | 当采用SUMOF([“abc”])的时候,返回的字段名依旧为”abc”
|
| SELECT_OPT_N_LEAD_COND | 6 | 64 | MovingFirst模式。当聚集函数使用次数以及条件的时候,64表示移动领先于条件,默认是条件领先于移动。例如AVGOF([0],[0]>0.5,10),如果采用64则表明为最近10个内大于0.5的平均数,如果没有该选项,则为最近10个大于0.5的平均数 移动的聚集函数也可以使用可选参数来实现这个功能,例如AVGOF([0],[0]>0.5,10,True)就表示对最近10个内符合条件的求平均,该参数为假表示最近10个符合条件的。
|
| SELECT_OPT_DUP_FIELD_POS_TO_LAST | 7 | 128 | 默认的时候当字段列表发生重复的时候,字段以及其计算的次序为第一个,当设置了128的时候,重复的字段以及其计算的次序为最后一个
|
| SELECT_OPT_REFOF_EMPTY_NIL | 8 | 256 | 默认refof的时候,当引用越界时,返回的数据为整数0,设置该标志的时候返回的数据为NIL
|
| 13 | 8192 | 使得返回字符串为Unicode
|
| SELECT_OPT_ORDERBY_REFOF | 14 | 16384 | 当有ORDER BY的时候(且非group by),返回列表里的REFOF和移动聚集函数的行为将会以排序结果集为基准,而非原始序。 暂不支持向后推移。
|
| 16 | 65536 | 用于禁用SQL聚集函数在移动计算时的快速计算(主要用于productof累乘这类快速计算可能会产生较大误差的聚集函数,禁止快速计算会使得效率变低)
|
| 17 | 131072 | 不禁用移动计算时的快速计算
|
| 18 | 262144 | 非MovingFirst模式
|
| 27 | 0x8000000(134217728) | TS-SQL语法中,可指定Openforwardonly模式,即提取到结果集后,不再对该结果集进行缓存
|
注:
1、关于MovingFirst模式与禁用移动计算时的快速计算模式位设置互相矛盾时
由于指定功能是与指定功能否是通过不同值进行的设置,因此在设置时可能同时存在,即出现位互相矛盾的情况时,则为MovingFirst为真的模式。
即若既设定16位也设定了第17位,或者设定了第6位也设定了18位,则依旧按照旧有真假模式,MovingFirst为真。
范例:
示例01:将表格行列下标更改为增长的自然数字下标数组
t:=Zeros(4,array('A','B','C','D'));
return select selectopt(8) * from t end;
返回结果:
示例02:对数组每列进行累加,累加后列名与原列名保持一致
t:=`array('A':0->5,'B':10->15,'C':20->25);
return select selectopt(16) sumof( *,1,6)from t end;
示例03:对数组进行分组后其它所有列求和
即除分组标识列后,其它所有列进行累加,累加后列名与原列名保持一致
实现:对数据t按第0列的值进行分组后,其它列分别相加求和
t:=array(
("股票1",100,300),
("股票2",1000,200),
("股票3",10000,14),
("股票2",100,200),
("股票3",10,140),
("股票4",100,15));
return select selectopt(16) sumof( * ),[0] from t group by [0] order by [0] end;
返回结果:
注:上述实现中selectopt(16) sumof( * )是在分组后,对所有列进行求和,由于0列不需要求和,因此取原始该列的值进行最后覆盖,保留原始值,达到目的。
示例04:多功能模式展示,设置selectopt的值为2^6+2^8,则表示在使用MovingFirst模式的同时设置refof越界时返回nil而非0。
t:=Integer(rand(20,"v")*100);
return select selectopt(2^6+2^8)*,
sumof(["v"],["v"]>30,2) as "sumV",
refof(["v"],5,["v"]>30) as "ref5"
from t end;
返回:
