TSL语言基础 > SQL基础到TS-SQL > TS-SQL语法 > SELECT查询语句 > Select子句 > 参数

SELECTOPT(Options)    

  • 指定SELECT的选项,控制SELECT的行为, Options 为以下数值的组合(以下数值的_XOR或者相加)
    下表中二进制位从0开始,可通过2^N(2的N次方)形式获取该位设置的值。
    同时设置多模式时,可通过相加方式得到,比如设置selectopt的值为2^6+2^8,则表示在使用MovingFirst模式的同时设置refof越界时返回nil而非0(可参考下面示例03)。
    选项名二进制位含义
    SELECT_OPT_SINGLEV01返回为单个值,与VSelect同
    SELECT_OPT_SINGLEARRAY12返回为一维数组,与SSelect同
    SELECT_OPT_MATRIX24返回为Matrix类型,与MSelect同
    SELECT_OPT_PACKED38返回的行列下标为增长的数字
    SELECT_OPT_MULTIAGGSAMENAME416当采用SUMOF( * )这种模式的时候,每个字段的聚集的名保持和字段一致
    SELECT_OPT_AGGSAMENAME532当采用SUMOF([“abc”])的时候,返回的字段名依旧为”abc”
    SELECT_OPT_N_LEAD_COND664MovingFirst模式。当聚集函数使用次数以及条件的时候,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_LAST7128默认的时候当字段列表发生重复的时候,字段以及其计算的次序为第一个,当设置了128的时候,重复的字段以及其计算的次序为最后一个
    SELECT_OPT_REFOF_EMPTY_NIL8256默认refof的时候,当引用越界时,返回的数据为整数0,设置该标志的时候返回的数据为NIL
    138192使得返回字符串为Unicode
    SELECT_OPT_ORDERBY_REFOF1416384当有ORDER BY的时候(且非group by),返回列表里的REFOF和移动聚集函数的行为将会以排序结果集为基准,而非原始序。 暂不支持向后推移。
    1665536用于禁用SQL聚集函数在移动计算时的快速计算(主要用于productof累乘这类快速计算可能会产生较大误差的聚集函数,禁止快速计算会使得效率变低)
    17131072不禁用移动计算时的快速计算
    18262144非MovingFirst模式
    270x8000000(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;

    返回: