`
z10one
  • 浏览: 10075 次
  • 性别: 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语句的基本结构。SQL主要由DML(数据...

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

    这个Python小工具的核心功能是利用正则表达式(Regular Expression)来解析SQL语句,正则表达式是一种强大的文本处理工具,能够匹配、查找、替换符合特定模式的字符串。在这个场景下,开发者编写了特定的正则模式来...

    在Sql Server查询语句中能不能用变量表示表名

    在SQL Server中,查询语句是否可以使用变量来表示表名是一个常见的疑问,尤其是在编写动态SQL时。在SQL Server中,确实可以通过变量来构建动态的表名,但这需要借助存储过程或者动态SQL来实现。这是因为SQL语句在...

    java的sql解析器jsqlparser

    然后,你可以创建一个`CCJSqlParserManager`实例,使用它来解析SQL字符串,得到AST。之后,遍历AST并提取所需信息。例如,以下是一个简单的代码片段: ```java import net.sf.jsqlparser.JSQLParserException; ...

    SQl查询数据库表名、表的列名

    根据给定的信息,本文将详细解释如何通过SQL查询获取数据库中的表名以及这些表的列名。这在数据库管理及开发工作中是常见的需求之一,掌握这些技能有助于更好地管理和操作数据库。 ### 一、获取数据库中的所有表名 ...

    通过解析sql语句获取表血缘关系项目

    在IT行业中,数据库管理和数据...总结来说,"通过解析SQL语句获取表血缘关系项目"是一个关键的数据管理实践,它依赖于对SQL的深入理解和合适的工具,以揭示数据库中的数据流动路径,从而支持更高效、更合规的数据操作。

    Apache的java解析sql工具包

    在Java编程环境中,处理SQL语句时,我们经常会遇到需要解析SQL的需求,比如为了验证语法、提取查询条件或者自定义SQL执行逻辑等。Apache提供了一个强大的工具包——JSqlParser,它是一个开源的Java库,专门用于解析...

    筛选多条SQL所查询的表名

    2. **SQL解析库**:更复杂的方法是使用SQL解析库,如`sqlparse`(Python)、`pgparser`(JavaScript)或`sql-analyzer`(Go),它们可以解析SQL语句并生成抽象语法树(AST)。通过遍历AST,我们可以准确地获取到每个...

    jsqlparser解析复杂sql

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

    SQL.zip_python sql_python 解析sql_python的SQL解析_python解析sql_sql 解析

    - `test3.py`可能包含了实现这些功能的代码,可能包括读取Excel文件,使用`sqlparse`解析SQL,以及在内存中的SQLite数据库上执行查询。 - `Asswei.xlsx`是待处理的Excel文件,其中的数据可能被加载到DataFrame,...

    基于SQL 语法解释器JSqlParser实现的SQL解析工具

    2. **基本用法**:展示如何创建一个解析器实例,并使用它来解析SQL语句,转化为AST对象。 3. **AST遍历**:解释如何遍历AST,访问每个节点,获取SQL语句的组成部分,如表名、列名、条件等。 4. **修改与重构SQL**...

    SqlParser C++实现的SQL语法解释器

    SqlParser是一款基于C++实现的SQL语法解释器,它的主要任务是解析SQL语句,将其转化为计算机可理解的形式,从而能够执行相应的数据库操作。在数据库系统中,SQL(Structured Query Language)是用于管理关系数据库的...

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

    在本文中,我们将深入探讨MyBatis-Plus动态表名SQL解析器的实现,这对于处理大量数据或需要根据特定条件动态切换表的应用场景至关重要。首先,我们来看一下动态表名在哪些情况下会用到。 一、动态表名的使用场景 1...

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

    6. **解析SQL文件**:读取刚刚生成的SQL文件,可以使用`BufferedReader`逐行读取。每一行假设为一个完整的SQL语句。 7. **执行SQL语句**:创建一个新的`Statement`或`PreparedStatement`,使用`executeUpdate()`...

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

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

    用delphi语言实现 sql语句循环表名

    在本篇文章中,我们将深入探讨如何使用Delphi编程语言实现SQL语句中的循环表名功能。这种方法对于需要处理大量数据库表或动态表名的应用场景非常有用。通过具体代码示例和详细解释,本文旨在帮助读者理解该技术的...

    基于Druid的SqlParser模块解析create table语句创建java POJO和DAO类的效率工具.zip

    SqlParser是Druid中的一个核心组件,用于解析SQL语句。它基于词法分析和语法分析的原理,将SQL语句转换为抽象语法树(AST),从而方便对SQL进行深度处理。通过这个模块,开发者可以轻松获取SQL的结构信息,例如表名...

    SQL-使用Python开发的SQL解析器和转换器.zip

    在Python中,可以使用像`sqlparse`这样的库来解析SQL语句,它能将SQL字符串分解为可操作的元素,如表名、列名、条件等。 4. SQL转换器: SQL转换器则将解析后的解析树转换为另一种形式,例如,将标准SQL转换为特定...

    在多表中查找一个表名或者字段名的 SQL 语句

    在Oracle数据库中,如果你想找出所有表名中包含特定字符串的表,可以使用以下SQL语句: ```sql SELECT * FROM user_tab_cols WHERE table_name LIKE '%STH%'; ``` 这里的关键在于`LIKE`操作符,它允许你在字符串中...

Global site tag (gtag.js) - Google Analytics