使用 SQL 查询语言,你只能查询位于数据库里面的数据,但是当你面对的数据是一些 Excel 表格或者 Txt 文本格式时,有什么办法能直接对着文件进行 Select 查询呢?

Ø 引言

作为一名数据库开发程序员,使用 SQL 语言查询数据是再普通不过的一件事。而 SQL 语言是基于数据库的查询语言,这就要求被查询的数据只能位于数据库中。但在实际工作中,时常会碰到一些不是来源于数据库的数据,特别是很多来自一些 Excel 表格或者 TXT 文本文件。如果要对它们进行 SQL 查询,通常做法是在数据库中创建临时表,然后导入数据后再使用 SQL 对其查询。这种做法本身未尝不可,但是有几点不妥:

首先,比较麻烦,数据的来源五花八门,格式不同,表结构也各不相同。导入操作往往只能由数据库管理员手动维护,其面临的复杂度可想而知。

其次,数据库常常会涉及敏感数据或安全考虑,就算你不怕麻烦,愿意去维护,也未必有权限进行这类操作。

最后,这些数据往往可能是临时的、突发的,根本不适合往数据库里添加,否则会搞得数据库越来越臃肿,最终导致整体访问性能低下。

有了这些不妥,程序员一般也就不得不放弃 SQL 式查询了,只能通过程序实现一些简单的关键字搜索等功能,毕竟自己去实现 SQL 语法的查询不仅难度大而且完全没必要。

但是 SQL 查询有时候真的很好用啊……那么,有没有一种第三方软件能实现 SQL 式查询文本,让程序员在享受便利的同时,不需要考虑上面这些烦心的问题呢?

答案自然是有,那就是本文要介绍的——集算器。

Ø 开始

下面就来介绍一下,如何在 Java 中利用集算器实现 SQL 式查询文本文件。当然,此处的文本文件不是指完全自由的文本文件,而是有格式规定的,类似于数据表的文件。

从官网下载并安装好集算器,将 dm.jar 及其依赖的配置文件 raqsoftConfig.xml 加入到当前程序的类路径。然后使用集算器提供的 JDBC 类,便可将文本文件当成数据库中的数据表来进行 SQL 式查询了。

示例用到两个文件,第一个 student.txt 数据内容如下:

数据格式为:第一行为字段名,后续行是数据,各列之间用 Tab 键分开。这个表是各个班级的学生基本情况。

第二个 score.txt 数据内容如下:

这个文件通过‘班级’,‘学生 ID’两个关键字段,记录每个学生的各科成绩。

Ø JDBC 示例

对于熟悉 JDBC 的同学来说,Java 调用集算器使用 SQL 查询文本的过程很简单,下面贴出示例代码:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

public class SQLDemo {

public static void main(String[] args) {

Connection con = null;// 连接

Statement stmt = null;// 执行语句

ResultSet rst = null;// 结果集

try {

/********* 通过 JDBC 连接到 集算器 *********/

Class.forName(“com.esproc.jdbc.InternalDriver”);

con = DriverManager.getConnection(“jdbc:esproc:local://”);

/******************* 执行语句方法 ********************/

stmt = con.createStatement();

rst = stmt.executeQuery(“SELECT * FROM score.txt”);

/******************* 执行语句方法结束 ****************/

ResultSetMetaData meta = rst.getMetaData();

for (int i = 0; i < meta.getColumnCount(); i++) {

System.out.print(meta.getColumnName(i + 1) + “\t”);

}

System.out.println();

// 输出结果

while (rst.next()) {

for (int i = 0; i < meta.getColumnCount(); i++) {

System.out.print(rst.getObject(i + 1) + “\t”);

}

System.out.println();

}

stmt.close();

con.close();

} catch (ClassNotFoundException cnf) {

System.out.println(“没找到驱动程序”);

cnf.printStackTrace();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

示例中可以看到加粗的 SQL 语句跟普通 SQL 语法基本一致,仅仅是表名不一样,这里直接写 TXT 文件名。执行后结果如下:

可以看到,使用集算器的 JDBC,完全可以将具有表结构的文本文件直接当成数据表来查询。而集算器除了支持 TXT 格式之外,还支持 CSV、XLS、XLSX 甚至 JSON。另外,集算器自身也有两种数据存储格式:BTX 和 CTX,也是可以直接查询的。

好,进一步的问题来了,集算器对 SQL 的各种命令能够支持到何种程度呢?

首先需要说明的是,集算器不是一个数据库产品,所以对 SQL 中一些数据库维护命令是不支持的,比如 Create、Delete 等。

那么对于 Select 可以支持到什么程度呢?

Ø 分组统计

下面来看看 SQL 查询中最普遍的查询,将 student.txt 跟 score.txt 关联起来,并分组统计出每名学生的总成绩。将上面示例代码中加粗的 SQL 语句替换为如下语句:

SELECT A. 班级,A. 姓名,sum(B. 成绩) 总分 FROM student.txt A JOIN score.txt B ON A. 班级 =B. 班级 AND A. 学生 ID=B. 学生 ID GROUP BY A. 班级,A. 姓名

执行后,得到每班学生的总分表:

可以看到,集算器用 SQL 查询文本时,对于常规的分组、表的联合都没问题。那么带参数的查询,又该如何写呢?

Ø 使用参数

只需将执行语句方法块里的代码替换为以下代码:

/******************* 执行语句方法 ********************/

CallableStatement cs = null; // 定义 CallableStatement 对象 String

String sql = “SELECT 姓名, 性别 FROM student.txt WHERE 班级 =?”;

cs = con.prepareCall(sql);

cs.setString(1, “一班”);

rst = cs.executeQuery();

/******************* 执行语句方法结束 ****************/

换完后,注意要引入 CallableStatement 类。执行后结果如下:

带参数的句子仍然没问题,调用方法也跟数据库标准是一致的。不过上述结果中,性别显示为数字,集算器 SQL 能不能支持转换语法呢?

Ø CASE 语句

将上面的 SQL 语句替换成带 CASE 的 SQL 语句:

SELECT 姓名,CASE 性别 WHEN 0 THEN ‘男’ ELSE ‘女’ END 性别 FROM student.txt WHERE 班级 =?

结果如下:

通过上面这几个例子可以看到,集算器对常用查询的支持还是比较全面的。鉴于篇幅原因,这里就不继续一一列举了。更多集算器查询文件时的详细语法以及函数,请参考文档:http://doc.raqsoft.com.cn/esproc/func/dbquerysql.html#db_sql_

java中sql查找_Java 中如何使用 SQL 查询文本相关推荐

  1. Java成员变量查找_Java中的成员变量和局部变量

    声明成员变量  可以用public proteced private修饰 eg public class Apple{ public String color;//声明公共变量 public stat ...

  2. CAD编辑工具中如何查找图纸中的坐标点的位置

    我们在CAD中,编辑完图纸后需要对图纸进行查看,因为一张完整的CAD图纸中有很多的内容.那么,CAD编辑工具中如何查找图纸中的坐标点的位置?小伙伴们知道要怎么来进行操作吗?那下面本编教程小编就来教教大 ...

  3. 计算机上的查找替换功能快速格式化,Word2013文档中使用查找和替换功能来快速更改文本格式的方法...

    在对文档进行处理时灵活使用Word的查找和替换功能将能够取得事半功倍的效果.下面介绍Word2013文档中使用查找和替换功能来快速更改文本格式的方法. 1.在"开始"选项卡中单击& ...

  4. java 防止sql注入_Java中SQL注入以及如何轻松防止它

    java 防止sql注入 什么是SQL注入? (What is SQL Injection?) SQL Injection is one of the top 10 web application v ...

  5. java二分法查找_java 中二分法查找的应用实例

    java 中二分法查找的应用实例 二分查找的前提是:数组有序 注意:mid的动态变化,否则出错!!! 实例代码: public class BiSearch { public static void ...

  6. java 数组元素查找_Java在数组中查找指定元素的方法

    Java在数组中查找指定元素我们是用什么方法来实现呢,是使用遍历查找还是使用其它的方法来查找呢,下面给各位整理了一些查找数组元素的例子. 以下实例演示了如何使用 contains () 方法来查找数组 ...

  7. java 字符串 字符查找_java之字符串中查找字串的常见方法

    1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. int indexOf(String str, int startIndex):从指定的索引处开 ...

  8. java中sql语句_java中sql语句的编写规则

    java中sql语句的编写规则 发布时间:2020-06-26 15:11:11 来源:亿速云 阅读:143 作者:Leah 这期内容当中小编将会给大家带来有关java中sql语句的编写规则,文章内容 ...

  9. java批量执行sql语句_Java中批量执行sql语句

    在我们实际项目开发过程中,可能有的功能在后台需要执行几条sql语句甚至需要批量的执行一些sql语句,如果是循环一条一条执行,我想大家都知道这样做的效率特别低,尤其是批量sql时,但是如果我们先循环把整 ...

  10. java变量存储位置_java 中变量存储位置的区别

    [原文] 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

最新文章

  1. TeamViewer介绍:远程控制计算机
  2. SSM+maven实现答题管理系统(二)
  3. python-leepcode-作用解析 - 5-27
  4. es scroll 时间_游标查询 Scroll | Elasticsearch: 权威指南 | Elastic
  5. 牛客多校6 - Josephus Transform(线段树求k-约瑟夫环+置换群的幂)
  6. 为什么又要造一个叫 Latke 的轮子
  7. delete from表名和truncate table 表名的区别
  8. Golang 垃圾回收机制
  9. 轻松使用终端开启macOS系统的隐藏功能,小白都能看得懂
  10. 计划的执行与回顾的重要性与必要性
  11. 提取数据_EasyStat如何提取数据+个性化出图
  12. python爬虫什么意思-Python爬虫可以做什么?
  13. Python字符串和列表常用的方法和操作
  14. 游戏挂机还开着电脑?那就真的out了!
  15. CSS——去除iframe边框
  16. 艾粽飘香,空相古寺钟声扬
  17. 图像相关层之卷积锐化图片示例
  18. Activity跳转方式
  19. 创建TLS 客户端凭据时发生严重错误。内部错误状态为 10013。处理记录
  20. 优信二手车业务规模大幅增长 业绩亮眼

热门文章

  1. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第4节 maven生命周期和概念模型图_09maven概念模型图...
  2. C# SOCKE通信
  3. 省选专练SCOI2015小凸想跑步
  4. Lintcode203 Segment Tree Modify solution 题解
  5. linux中配置Java环境
  6. biztalk中架构验证、实例生成和验证
  7. 解决docker-compose: command not found
  8. 硬件开发者之路之——保护电路系列之输入电源端口的防护设计
  9. 20180330试试水
  10. 性能测试工具Loadrunner使用之一(Virtual User Generato)