`
z10one
  • 浏览: 9564 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

解析sql中的表名

阅读更多

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SqlTabName {

    public static void main(String[] args) throws Exception {
       
        String s = "select * from aaa";
       
        getStrings01();
        //SELECT 列名称(*所有列) FROM 表名称
        //SELECT 列名称 FROM 表名称 where 条件
//        System.out.println( matchSql( "select * from aaa ") );
//        System.out.println( matchSql( "select id,name,password from bbb where id = 1 ") );
//        //INSERT INTO 表名称 VALUES (值1, 值2,....)
//        //INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
//        System.out.println( matchSql("insert into ccc valuse(1,'neo','password')") );
//        System.out.println( matchSql("insert into ddd (id,name,password) valuses(1,'neo','password')") );
//        //UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
//        System.out.println( matchSql("update eee set name = 'neo' where id = 1 ") );
//        //DELETE FROM 表名称 WHERE 列名称 = 值
//        System.out.println( matchSql("delete from fff where id = 1 ") );

//        String sql = "delete from fff where id = 1 ";
//        String changedSql = changeDelete(sql);
//        System.out.println(changedSql);
    }
     private static void getStrings() throws Exception {
         String txt = "";
         String ss = "E:\\aa\\one.txt";
            File file = new File(ss);
            InputStreamReader read = new InputStreamReader(
                    new FileInputStream(file),"UTF-8");//考虑到编码格式
                    BufferedReader bufferedReader = new BufferedReader(read);
                    String lineTxt = null;
                    while((lineTxt = bufferedReader.readLine()) != null){
                        txt += lineTxt + "\n\t";
//                        System.out.println(lineTxt);
                    }
                    read.close();
//                    System.out.println(txt);
//            String str = "select * from aaa a left from bbb b on a.a = b.a ";
//            String sm = "select * from (select * from s.aaas)";
//            String pp = "\\*\\s+from\\s+[\\w]*\\.?[\\w]*\\.?\\[?(\\b\\w+)\\]?[\\r\\n\\s]*";
//            String diy = "\\s+(join|from)\\s+([(\\w+\\.)]?\\w+)[\\s^]*";
//                    System.out.println(txt);
            Pattern ps = Pattern.compile("(?ms)('(?:''|[^'])*')|--.*?$|/\\*.*?\\*/"); 
            String presult = ps.matcher(txt).replaceAll("$1");
//                    System.out.println(presult);
                    String diy = "\\s+(join|from)\\s+((\\w+\\.)\\w+)[\\s^]*";
//            String diy = "\\s+(join|from)\\s+(\\w+\\.?\\w*)[\\s^]*";
            Pattern p = Pattern.compile(diy);
            Matcher m = p.matcher(presult.toLowerCase());
            Set<String> strs = new HashSet<String>();
            while (m.find()) {
                strs.add(m.group(2));           
            }
            for (String s : strs){
                System.out.println(s.toUpperCase());
            }       
        }
     
    /**
     * @param sql lowcase
     * @return
     */
    public static String matchSql(String sql){
        Matcher matcher = null;
        //SELECT 列名称 FROM 表名称
        //SELECT * FROM 表名称
        if( sql.startsWith("select") ){
            matcher = Pattern.compile("select\\s.+from\\s(.+)where\\s(.*)").matcher(sql);
            if(matcher.find()){
                return matcher.group(1);
            }
        }
        //INSERT INTO 表名称 VALUES (值1, 值2,....)
        //INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
        if( sql.startsWith("insert") ){
            matcher = Pattern.compile("insert\\sinto\\s(.+)\\(.*\\)\\s.*").matcher(sql);
            if(matcher.find()){
                return matcher.group(1);
            }
        }
        //UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
        if( sql.startsWith("update") ){
            matcher = Pattern.compile("update\\s(.+)set\\s.*").matcher(sql);
            if(matcher.find()){
                return matcher.group(1);
            }
        }
        //DELETE FROM 表名称 WHERE 列名称 = 值
        if( sql.startsWith("delete") ){
            matcher = Pattern.compile("delete\\sfrom\\s(.+)where\\s(.*)").matcher(sql);
            if(matcher.find()){
                return matcher.group(1);
            }
        }
        return null;
    }
   
    private static void getStrings01() throws Exception {
         String txt = "";
         String ss = "E:\\aa\\one.txt";
            File file = new File(ss);
            InputStreamReader read = new InputStreamReader(
                   new FileInputStream(file),"UTF-8");//考虑到编码格式
                   BufferedReader bufferedReader = new BufferedReader(read);
                   String lineTxt = null;
                   while((lineTxt = bufferedReader.readLine()) != null){
                       txt += lineTxt + "\n\t";
                   }
                   read.close();
           Pattern ps = Pattern.compile("(?ms)('(?:''|[^'])*')|--.*?$|/\\*.*?\\*/"); 
           String presult = ps.matcher(txt).replaceAll("$1");
//         String diy = "\\s+(join|from)\\s+((\\w+\\.)\\w+)[\\s^]*";  //获取带schema的表
            String diy = "\\s+(join|from)\\s+(\\w+\\.?\\w*)[\\s^]*";   // 获取带schema的表和不带schema的表
            Pattern p = Pattern.compile(diy);
            Matcher m = p.matcher(presult.toLowerCase());
            Set<String> strs = new HashSet<String>();
            while (m.find()) {
                strs.add(m.group(2));           
            }
            for (String s : strs){
                System.out.println(s.toUpperCase());
            }       
        }
}

分享到:
评论

相关推荐

    解析SQL提取表名并输出文本文件

    本小工具实现了解析sql文件,并将文件中存在的所有表名解析出来,保存成文本文件,在存储过程及数据处理上对工作有帮助,方便实用。 如果觉得好,作者会增加一些参数,将此小工具做得更完善。

    从SQL脚本抽取数据库表名小工具.zip

    从SQL脚本抽取数据库表名的Python小工具。利用正则表达式实现了从复杂的SQL脚本中抽取出使用的数据库实体表名。

    java的sql解析器jsqlparser

    支持解析sql的正确性,可以解析出sql 的列名,表名,别名,条件等,非常好用

    jsqlparser解析复杂sql

    jsqlparser解析复杂sql 获取where条件字段 select字段 表名table 查询join 查询 group by 查询order by 子查询 判断是否为多级子查询

    java读取数据库表中内容转存sql文件,然后解析执行此文件

    java读取数据库表中内容转存sql文件,然后解析执行此文件

    根据MyBatis或iBatis的SQLMapper文件反向生成数据库表

    解析SQL语句: 对于每一条SQL语句,需要解析其中的表名、字段名、数据类型、约束条件等信息。这可以通过正则表达式或者专门的SQL解析器来实现。 生成数据库表结构: 根据解析得到的SQL语句中的表名、字段名、数据类型...

    MyBatis-Plus 动态表名SQL解析器的实现

    主要介绍了MyBatis-Plus 动态表名SQL解析器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    SQL实现html页面取表名

    oracle中clob字段中存有html 通过正则取其中表名

    提取Druid的SQL解析器

    认识 Druid  Druid 是阿里巴巴...  Druid SQL 解析器  Druid 作为一个数据库连接池,功能很多,但我接触 Druid 的时候,却不是因为它有世界上好的数据库连接池实现。而是因为有些开源项目(比如,mycat),借用了

    java8源码-sqlParser:使用java和antlr4的sql解析器

    内存中数据进行操作,对用户透明,并实现部分 sql 执行 4.Java 内存数据为行式存储,数据均为 String 类型,使用时进行转换 运行环境 1.Java 8 2.Antlr4.9 功能 1.实现 where = xxx 的等值单条件筛选查询 2.支持嵌...

    sqlparser:Go中实现SQL解析器

    sqlparser Go包,用于解析MySQL SQL查询。注意此的主干是从提取的。 在vitessio / vitess内部,有一个写得很好的sql解析器。 但是,由于它不是一个独立的应用程序,所以我创建了这个应用程序。 它适用于与vitessio /...

    java如何获得数据库表中各字段的字段名

    java如何获得数据库表中各字段的字段名

    [自己开发]一款非常好用的抓取Oracle数据库SQL语句的工具

    Oracle SQL Profiler,自己设计算法写的一款非常好用的抓取Oracle数据库SQL语句的工具,可以再没有源码的情况下监控ORACLE...结果可以输出到Oracle表中(表名自己设置),也可只跟踪当前用户,效果图见result.png。

    SQLparser:专为MyCAT 2.0设计的快速SQL解析器

    单个sql语句中令牌位置,例如[select(1),from(15),join(26)] 单个sql语句表名位置及其哈希√ 单个sql语句库名(与表名相关)位置及其哈希√ 是否包含注解√ 注解类型√ 注解语句√ sql关键字替换

    SQL编写规范(数据库操作规范)

     ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理    在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表    当...

    SQL数据库资源大放送

    ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    ORACLE优化SQL语句,提高效率

     Oracle在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等。  (5)在SQL*Plus , SQL*Forms和Pro*C中重新配置ARRAYSIZE参数, 能够增加每次数据库访问的检索数据量 ,建议值为200。  ...

    SQL语句优化的34条建议

    orACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    基于C#实现将Excel的内容导出成sql语句,Excel的文件名作为导入的表名,Excel的列名为导入数据库表的字段名

    基于C#实现将Excel的内容导出成sql语句,Excel的文件名作为导入的表名,Excel的列名为导入数据库表的字段名 使用方法 1.准备一个excel 文件名为到数据库的表名,内容为要生成...3.应用程序完成excel解析并生成sql语句。

    读取.sql文件,转化为javabean保存为.java文件

    该项目可以读取.sql文件,找出表名和字段名,然后把他们转化为javabean保存为.java文件。

Global site tag (gtag.js) - Google Analytics