MOQL—筛选器(Selector)(三)

HAVING子句

         与SQL语法一致,描述了对group by子句中产生的组数据进行过滤的过滤条件。Having子句中的所有字段都需要是select子句中的列,与where不同的是,这里是对分组结果数据的过滤,而where是对原始表数据进行的。

[having SEARCH_CONDITION]

SEARCH_CONDITION为具体的查询条件,其详细描述参见《MOQL—过滤器(Filter)》。

集合运算子句

         集合运算描述了两个或多个查询结果间的运算,运算包括:union(并集)、except(差集)、symexcept(对称差集)、complementation(补集)以及intersect(交集)等。其语法结构如下:

[union [all]|except|symexcept|complementation|intersect[all]QUERY_EXPRESSION]

   进行集合运算的两个结果集A、B,其集合运算式为:“A 集合运算符 B”。A、B两个结果集,其字段数目和字段顺序可以不一致,但必须保证集合A的字段定义包含于集合B的字段定义中,否则两个结果集无法进行正常的集合运算。运算时,集合运算以左操作数即A结果集的字段和字段序为基础进行集合运算。

union [all]

   表示两个查询结果合并在一起。 [all]表示合并集合时,不去除两个集合中相同的记录。而缺省情况下,若两个集合存在完全一样的多条记录,则只保留一条。并集的数学式为:A ∪ B。

except

   表示两个查询结果进行差集运算,即用第一个结果集减去第二个结果集,去除第一个结果集中与第二个结果集完全相同的记录后剩下的记录即为差集结果。如:两个集合A、B,其差集数学式为:A – B。

symexcept

   对称差集的结果为两个查询结果互相求差集后,又对两个差集求了并集。其数学式为:A – B ∪ B– A。

complementation

   表示先对两个结果集求合集,然后再求左操作数结果集的补集。如:A complementation B,其对应的补集数学式为 (A ∪ B) – A。

intersect [all]

   表示对两个结果集求交集。[all] 表示集合相交时,不去除交集中两个结果集多次相交命中的相同的记录。而缺省情况下,若交集中存在完全一样的多条记录,则只保留一条。交集的数学式为:A ∩ B。

ORDER BY子句

         与SQL语法一致,描述了如何对查询结果进行排序,排序是按哪个或是哪几个字段进行排序;按升序、还是按降序排序等。一个Selector定义中只能有一个order by子句,但可以有多个select子句。

[order by ORDER_ITEM [asc |desc] [, ...]]

ORDER_ITEM [asc | desc]

   表示要进行排序的字段的名字。这个字段可以是select子句中的列或者是其别名;也可以是列的索引值,索引从1开始计数;还可以是from子句中任意一个表(集合对象)的字段名,如:table1.name,table1为集合对象的别名,而name为该集合对象的一个字段。用于排序的字段不必要一定是select子句中包含的列。[asc |desc]表示排序方式,asc表示对字段中的数据按升序排序;desc表示对字段中的数据按降序排序。排序时可以同时指定多个字段及排序方式。执行时,排序工作从左到右依次对每个字段进行排序。其含义为,首先对结果集按字段1进行排序;然后在此基础上对数据字段1相同的记录再按字段2进行排序……。

LIMIT子句 

[limit [OFFSET,] N[%]]

   表示从指定的偏移开始,返回查询结果的前N条记录或前N%的记录。OFFSET表示从结果集的哪个位置开始取数据,而N表示取的数据的个数。Limit可用于分页查询。OFFSET和N为正整数,两者的的取值与cache设定的大小相关,OFFSET和N应该小于等于cache的大小。当OFFSET为0,N大于cache的大小时,表示返回全部结果。另外,当其表示百分数时,若N大于100也表示返回所有的结果数据。

DECORATE BY子句

[decorate by DECORATE_FUNCTION[, ...]]

 

       表示对其它子句处理后的查询结果集按指定的方法进行装饰修改。DECORATE_FUNCTION表示一个装饰函数,该函数可以对结果集对象进行修改处理。该子句可以支持多个装饰函数,装饰函数间用“,”号隔开。装饰函数按从左到右的顺序依次执行,对结果集进行装饰。如:groupRowNumber(groupFields,valueField)函数,其含义同oracle的ROW_NUMBER_OVER函数,表示对有相同值的groupFields字段集合的纪录进行编号。每组groupFields值相同的记录,其编号值都是从1开始递增,不同组的记录其编号彼此独立增长。编号值最后将被放入到valueField所描述的字段中(见源码包中的TestSelector类的testGroupRowNumberDecorate方法)。DECORATE_FUNCTION可以通过编写函数进行扩展(扩展方法详见《MOQL—函数(Function)》),用户可以根据需要扩展对结果集的修饰逻辑。原则上讲,装饰函数不能增加或删除结果集的列,只能修改结果集的列。

       Selector各子句都有相关的代码样例,在jar包的example/TestSelector.java中,这里就不一一列举,有兴趣的朋友可以在如下的项目路径中下到最新的jar包。

 

项目地址:http://sourceforge.net/projects/moql/

代码路径:svn://svn.code.sf.net/p/moql/code/trunk

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值