A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Java 搞定 SQL 集合运算的最简方法

摘要: 问题介绍  作为 java 程序员,用代码直接实现类似 SQL 中的交并补差的集合运算,总是要编写大量的代码,如果能有一个专门的外部数据工具,通过写简单类似 SQL 的脚本来实现,在 java 中直接调用并可以返回结果集,就再好不过了。

问题介绍
  作为 java 程序员,用代码直接实现类似 SQL 中的交并补差的集合运算,总是要编写大量的代码,如果能有一个专门的外部数据工具,通过写简单类似 SQL 的脚本来实现,在 java 中直接调用并可以返回结果集,就再好不过了。Java 版集算器正是解决这一难题的神器,通过 SPL 脚本可以直观自然得写出运算,再使用 java 调用 SPL 脚本,使用起来简单,快捷,高效。另外,虽然 SQL 有集合概念,但对于有序集合运算提供的支持却很有限,经常要采用很费解的思路才可以完成, SPL 基于离散数据集模型,能轻松处理有序集合运算。下面我们就由浅入深,举例说明如何使用。
SPL 实现
和集
  示例 1: 求重叠时间段的总天数
MySQL8:
with recursive t(start,end) as (select date'2010-01-07',date'2010-01-9'
[Java] 纯文本查看 复制代码
union all select date'2010-01-15',date'2010-01-16'
union all select date'2010-01-07',date'2010-01-12'
union all select date'2010-01-08',date'2010-01-11'),
t1(d,end) as (select start,end from t
[Java] 纯文本查看 复制代码
union all select d+1,end from t1 where d
select count(distinct d) from t1;
  说明:此例先将各时间段转成时间段内所有日子对应的日期,然后再求不同日期的个数
集算器 SPL:
 A3: 对 A2 中的每一个时间段构造从 start 到 end 的日期序列
  A4: 求 A3 中所有日期序列的和
  A5: 求 A4 中不重复日期的个数
保存脚本文件SumSet.dfx (嵌入 Java 会用到)
差集
  示例 1: 列出英语人口和法语人口均超过 5% 的国家
MySQL8:
with t1(lang) as (select 'English' union all select 'French')
[Java] 纯文本查看 复制代码
select name from world.country c
where not exists(select * from t1 where lang not in (select language from world.countrylanguage 
    where percentage>=5 and countrycode=c.code
)
);
  说明:此 SQL 只是演示通过双重否定实现差集为空
集算器 SPL:
A4: 选出 [“English”,”French”] 与本组语言集合的差为空的组,意思就是选出语言集合包含 English 和 French 的组
Java 调用
  SPL 嵌入到 Java 应用程序十分方便,通过 JDBC 调用存储过程方式加载,用和集保存的文件SumSet.dfx,示例调用如下:
[Java] 纯文本查看 复制代码
...
Connection con = null;
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用存储过程,其中SumSet是dfx的文件名
st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call SumSet()");
//执行存储过程
st.execute();
//获取结果集
ResultSet rs = st.getResultSet();
...
  替换成DifferenceSet.dfx或IntersectionSet.dfx是同样的道理,只需 call DifferenceSet()或者 call IntersectionSet() 即可。这里只用 Java 片段粗略解释了如何嵌入 SPL,详细步骤请参阅Java 如何调用 SPL 脚本​,也非常简单,不再赘述。同时,SPL 也支持 ODBC 驱动,集成到支持 ODBC 的语言,嵌入过程类似。
扩展节选
  关于集合运算除了上面讲的和差交运算,还可以获取与行号有关的计算,以及有序集合的对位运算。
根据行号取数据
  示例 1: 计算招商银行 (600036) 2017 年第 3 个交易日和倒数第 3 个交易日的交易信息
MySQL8:
with t as (select *, row_number() over(order by tdate) rn from stktrade where sid='600036' and tdate between '2017-01-01' and '2017-12-31')
SPL 优势
有库写 SQL,没库写 SPL
  用 Java 程序直接汇总计算数据,还是比较累的,代码很长,并且不可复用,很多情况数据也不在数据库里,有了 SPL,就能像在 Java 中用 SQL 一样了,十分方便。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马