Java druid 递归 SQLSelect 中所有的* 替换为对应字段
时间: 2024-02-03 21:13:04 浏览: 100
java使用druid进行sql解析,可解析出物理表,外层投影列对应的物理表和字段
可以通过以下代码实现递归替换:
```java
public static void replaceStarColumns(SQLSelect select) {
List<SQLSelectQuery> queries = select.getQueries();
if (queries != null && queries.size() > 0) {
for (SQLSelectQuery query : queries) {
if (query instanceof SQLSelectQueryBlock) {
SQLSelectQueryBlock block = (SQLSelectQueryBlock) query;
List<SQLSelectItem> selectList = block.getSelectList();
if (selectList != null && selectList.size() > 0) {
for (SQLSelectItem item : selectList) {
SQLExpr expr = item.getExpr();
if (expr instanceof SQLAllColumnExpr) {
SQLTableSource from = block.getFrom();
if (from instanceof SQLSubqueryTableSource) {
replaceStarColumns(((SQLSubqueryTableSource) from).getSelect().getQuery());
} else if (from instanceof SQLJoinTableSource) {
SQLTableSource left = ((SQLJoinTableSource) from).getLeft();
SQLTableSource right = ((SQLJoinTableSource) from).getRight();
if (left instanceof SQLSubqueryTableSource) {
replaceStarColumns(((SQLSubqueryTableSource) left).getSelect().getQuery());
}
if (right instanceof SQLSubqueryTableSource) {
replaceStarColumns(((SQLSubqueryTableSource) right).getSelect().getQuery());
}
}
item.setExpr(new SQLSelectList(new ArrayList<SQLSelectItem>() {{
for (SQLSelectItem selectItem : ((SQLSelectQueryBlock) from).getSelectList()) {
add(selectItem.clone());
}
}}));
}
}
}
}
}
}
}
```
这个方法会递归遍历 SQLSelect,如果发现有 `*`,则会将其替换为对应的字段。替换的方式是将 `SQLAllColumnExpr` 替换为一个 `SQLSelectList`,然后将对应的字段加入到这个 `SQLSelectList` 中。需要注意的是,在遍历时,如果发现 `from` 是个子查询或者连接查询,也需要递归遍历子查询或者连接查询中的 `select` 子句,以便找到对应的字段。
阅读全文