java - 无论 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(?,?)
如何像上面那样获取插入查询的表名。
解决方案
这是一个简短的代码,提示您如何解决此问题。它使用具有以下模式的正则表达式匹配器:
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 解析器。对于简单的选择和插入查询,这可能是一个很好的起点。
推荐阅读
- javascript - react-pdf安装时出现webpack插件错误
- hbase - HBase 版本 1.X 和 2.X 有什么区别
- opencv - 如何存储一维向量
在 Mat 中以及如何访问 Mat 中的这些点? - google-bigquery - BQ中的加工位置
- javascript - 启用排序时 React-Virtualized 取消点击事件
- powershell - 尝试在 Powershell 中更新 VMware 时出现更新工具 Powercli 错误
- android - 使用 Kotlin 的 android 手机屏幕上没有出现文本视图内容
- excel - TEXT 函数不显示月份或年份
- python - Pycharm自动上传删除文件
- splunk - 如何建立一个持续的警报来捕捉某个 http 错误代码的突然峰值?