解析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());
            }       
        }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解析SQL语句提取表名并将结果输出到文本文件,可以使用编程语言(如Python)SQL解析库进行操作。 首先,需要安装并导入相应的SQL解析库,例如`sqlparse`库。 然后,读取SQL语句的文本文件(假设名为`sql_query.sql`),将其内容存储在一个字符串变量。 接下来,使用`sqlparse`库的`parse`函数对SQL语句进行解析,将解析的结果保存在一个变量。 通过遍历解析结果,我们可以提取出SQL语句的每个表名,并将其存储在一个列表。 最后,将提取出的表名列表的每个表名按行输出到一个文本文件,这样就完成了将表名提取并输出的操作。 下面是一个示例代码: ```python import sqlparse # 读取SQL语句的文本文件 with open('sql_query.sql', 'r') as file: sql_query = file.read() # 解析SQL语句 parsed_query = sqlparse.parse(sql_query) # 提取表名 table_names = [] for statement in parsed_query: for token in statement.tokens: if token.is_group() and token.get_real_name() == 'FROM': for identifier in token.get_identifiers(): table_names.append(identifier.get_real_name()) # 输出表名到文本文件 output_file = 'table_names.txt' with open(output_file, 'w') as file: for table_name in table_names: file.write(table_name + '\n') print(f"成功将表名提取并输出到了文件:{output_file} ") ``` 在上述代码,需要将SQL语句的文本文件命名为`sql_query.sql`,并将输出的文本文件命名为`table_names.txt`。请确保路径正确,并确保能够在运行该代码时正确安装并导入`sqlparse`库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值