首页 > 解决方案 > 无论 CRUD 操作如何,都从字符串查询中获取表名

问题描述

我有如下字符串。我必须从中获取所有表名。

 select SEQ_NO,CODE,CD_NAME,CD_TYPE,CD_CITY,CDS_STATUS,CDS_SUBSTATUS,  
 to_char(CDS_LAST_MOD_DATE,'dd/mm/yyyy') as CDS_LAST_MOD_DATE   from  
 company_details left outer join on company_details_status where  
 cd_seq_no=cds_seq_no,CODE=(select CODE from company_details where cd_seq_no='1' )  order by CDS_LAST_MOD_DATE.


Insert into table1 value(?,?)
Insert into table1 (col1,col2) values(?,?)

如何像上面那样获取插入查询的表名。

标签: javasql-parserjsqlparser

解决方案


这是一个简短的代码,提示您如何解决此问题。它使用具有以下模式的正则表达式匹配器:

FROM\s+(\S+)|JOIN\s+(\S+)|INSERT\s+INTO\s+(\S+)

FROM此处的目的是在表名出现在 select 语句(after和JOIN)或 insert 语句(after )中时捕获它们INSERT INTO。请注意,该模式使用三个捕获组的交替。

String query =  "SELECT a.col1, b.col2 FROM tableA a INNER JOIN tableB b ";
       query += "ON a.key = b.key; INSERT INTO tableC (col1) VALUES ('hello')";
String pattern = "FROM\\s+(\\S+)|JOIN\\s+(\\S+)|INSERT\\s+INTO\\s+(\\S+)";

Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = r.matcher(query);
while (m.find()) {
    String match = m.group(1) != null ? m.group(1) :
        (m.group(2) != null ? m.group(2) : m.group(3));
    System.out.println(match);
}

tableA
tableB
tableC

演示

显然,我可能错过了许多边缘情况。一般来说,要获得完整的解决方案,您可能必须编写一个实际的 SQL 解析器。对于简单的选择和插入查询,这可能是一个很好的起点。


推荐阅读