没有数据库也能用 SQL

devtools/2024/11/14 7:38:56/

手头有些 csv/xls 文件,比如这样的:

430d9b9a7e07665a5fca83de8237df88_531322png

dfb0d3c19ee6d9d57f7e2d522f2b605f_531320png

这种数据很适合用 SQL 做查询,但可惜 SQL 只能用在数据库,要安装个数据库并把这些文件导入,为这么个目标搞的整个应用系统都臃肿很多,实在是划不来。要是有什么技术能直接把这些文件当成数据表用 SQL 查询就好了。

没问题,SPL.html" title=esProc SPL>esProc SPL 来帮你。
SPL.html" title=esProc SPL>esProc SPL 是个开源软件,到这里 https://github.com/SPLWare/esProc 找。

esProc 提供了标准的 JDBC 驱动,被 Java 程序引入后,就可以文件使用 SQL 查询了。

Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
PrepareStatement st = conn.prepareStatement("$select * from employee.txt where SALARY >=? and SALARY<?");
st.setObject(1, 3000);
st.setObject(2, 5000);
ResultSet result=st.execute();

在命令行中也可以用 SQL 来查询文件:

esprocx.exe -R select Client,sum(Amount) from d:/Orders.csv group by Client

esProc 提供了相当于 SQL92 标准的 SQL 语法:

select * from orders.xls where Amount>100 and Area='West' order by OrderDate desc
select Area, sum(Amount) from orders.xls having sum(Amount)>1000
select distinct Company from orders.xls where OrderDate>date('2012-7-1')

还有 join:

select o.OrderId,o.Client,e.Name e.Dept from d:/Orders.csv o ,d:/Employees.csv e where o.SellerId=e.Eid
select o.OrderId,o.Client,e.Name e.Dept,e.EId from Orders.txt o left join Employees.txt e on o.SellerId=e.Eid

子查询和 with 都支持:

select t.Client, t.s, ct.Name, ct.address from (select Client ,sum(amount) s from Orders.csv group by Client) 
left join ClientTable ct on t.Client=ct.Client
select * from d:/Orders.txt o where o.sellerid in (select eid from Employees.txt)
with t as (select Client ,sum(amount) s from Orders.csv group by Client)
select t.Client, t.s, ct.Name, ct.address from t left join ClientTable ct on t.Client=ct.Client

其实,esProc 并不是一个专门提供 SQL 语法的产品,它本身有 SPL 语法,SQL 只是在 SPL 的基础上顺便提供的,所以 esProc 可以做到不依赖于数据库执行 SQL。
SPL 的支持下,可以进一步拓展这些 SQL 的应用范围,比如支持格式不太规范的文件:
用 | 分隔的文本

select * from {file("Orders.txt").import@t(;"|")} where Amount>=100 and Client like 'bro' or OrderDate is null

没有标题行的文本,用序号表示字段

select * from {file("Orders.txt").import()} where _4>=100 and _2 like 'bro' or _5 is null

读取 Excel 的某个 sheet

select * from {file("Orders.xlsx").xlsimport@t(;"sheet3")} where Amount>=100 and Client like 'bro' or OrderDate is null

还可以查询 json 文件

select * from {json(file("data.json").read())} where Amount>=100 and Client like 'bro' or OrderDate is null

以及从 web 下载来的 json

select * from {json(httpfile("http://127.0.0.1:6868/api/getData").read())} where Amount>=100 and Client like 'bro' or OrderDate is null

SPL 还能访问来自 mongodb,kafka,…的数据,当然普通关系数据库更不在话下。这就可以形成多样数据源上的混合计算能力。

SPL 的能力也远不止于此,esProc 初衷也是提供比 SQL 更强大且方便的运算能力,而 SQL 语法一定程度地限制了查询的描述,只能适应于相对简单的场景。
比如这个任务,计算一支股票最长连续上涨的天数,SQL 要写成多层嵌套,冗长且难懂:

select max(ContinuousDays) from (select count(*) ContinuousDays from (select sum(UpDownTag) over (order by TradeDate) NoRisingDays from (select TradeDate,case when Price>lag(price) over ( order by TradeDate) then 0 else 1 end UpDownTag from Stock ))group by NoRisingDays )

同样的计算逻辑,用 SPL 写起来要简单得多:

Stock.sort(TradeDate).group@i(Price<Price[-1]).max(~.len())

esProc 还有所见即所得的 IDE,调试代码也远比 SQL 方便:

阅读这里 写在格子里的程序语言 ,可以对 SPL 有更多的理解,它可以取代几乎所有的数据库计算能力,还要更强大得多。

开源SPL源码地址

免费下载试用


http://www.ppmy.cn/devtools/133388.html

相关文章

代码随想录刷题记录(二十七)——55. 右旋字符串

&#xff08;一&#xff09;问题描述 55. 右旋字符串&#xff08;第八期模拟笔试&#xff09;https://kamacoder.com/problempage.php?pid1065字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&…

JavaScript如何操作HTML:动态网页构建指南

JavaScript如何操作HTML&#xff1a;动态网页构建指南 在现代网页开发中&#xff0c;JavaScript不仅是实现网页交互性的关键技术&#xff0c;也是动态操作HTML文档对象模型&#xff08;DOM&#xff09;的重要工具。通过JavaScript&#xff0c;开发者可以在运行时修改网页的内容…

[C++]——位图与布隆过滤器

目录 一、前言 二、正文 1.位图 1.1 位图概念 1.2 位图的实现 1.2.1 Set 1.2.2 ReSet 1.2.3 Text 1.3 位图的应用 2.布隆过滤器 2.1布隆过滤器的提出 2.2 布隆过滤器概念 2.3 布隆过滤器的实现 2.3.1布隆过滤器的插入 2.3.2 布隆过滤器的查找 2.3.3 布隆过滤器…

021_SSH_Mysql校园播客系统(视频播放 评论)_lwplus87

摘 要 Internet是一个蕴藏着无穷资源的宝库&#xff0c;在资源共享和信息交换方面具有得天独厚的优势。21世纪的今天&#xff0c;上网已经成为很多人工作、生活中必不可少的一部分&#xff0c;这很大程度上是由于网页承载了任何一种媒介都无法比拟的丰富资源&#xff0c;网页…

Android 解决Java和Kotlin JDK编译版本不一致异常

异常信息 Execution failed for task :andcodec:compileDebugKotlin. > compileDebugJavaWithJavac task (current target is 1.8) and compileDebugKotlin task (current target is 17) jvm target compatibility should be set to the same Java version.Consider using …

Spark 新作《循序渐进 Spark 大数据应用开发》简介

《循序渐进Spark大数据应用开发》由清华大学出版社出版&#xff0c;已于近期上市。该书基于Spark 3.5.1编写&#xff0c;提供24个实战案例26个上机练习&#xff0c;可谓是目前市面上最新的Spark力作。 本文对《循序渐进Spark大数据应用开发》一书做个大致的介绍。 封面部分 …

软件工程 软考

开发大型软件系统适用螺旋模型或者RUP模型 螺旋模型强调了风险分析&#xff0c;特别适用于庞大而复杂的、高风险的管理信息系统的开发。喷泉模型是一种以用户需求为动力&#xff0c;以对象为为驱动的模型&#xff0c;主要用于描述面向对象的软件开发过程。该模型的各个阶段没有…

Python毕业设计选题:基于django+vue的论坛BBS系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 公告信息管理 帖子信息管理 签到积分管理 系统…