代码片(直接复制粘贴使用即可)
/**
* sql解析
* @param sql
* @return
*/
@PostMapping("/analyzeSelectSQL")
@ResponseBody
public List<String> analyzeSelectSQL(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@RequestParam("sql") String sql) throws SQLException {
List<String> result = new ArrayList<String>();
try {
CCJSqlParserManager pm = new CCJSqlParserManager();
net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql));
if (statement instanceof Select) {
Select selectStatement = (Select) statement;
List<SelectItem> selectItemlist = new ArrayList<SelectItem>();
if(selectStatement.getSelectBody() instanceof PlainSelect){
PlainSelect selectBody = (PlainSelect) selectStatement.getSelectBody();
selectItemlist = selectBody.getSelectItems();
}else if(selectStatement.getSelectBody() instanceof SetOperationList){
SetOperationList operationList = (SetOperationList) selectStatement.getSelectBody();
List<SelectBody> list = operationList.getSelects();
for (SelectBody a : list) {
if(a instanceof PlainSelect){
PlainSelect selectBody = (PlainSelect) a;
selectItemlist.addAll(selectBody.getSelectItems());
}
}
// List<SelectItem> selectItemlist = selectBody.getSelectItems();
}
SelectItem selectItem = null;
SelectExpressionItem selectExpressionItem = null;
AllTableColumns allTableColumns = null;
Alias alias = null;
SimpleNode node = null;
if (selectItemlist != null) {
for (int i = 0; i < selectItemlist.size(); i++) {
selectItem = selectItemlist.get(i);
if (selectItem instanceof SelectExpressionItem) {
selectExpressionItem = (SelectExpressionItem) selectItemlist.get(i);
alias = selectExpressionItem.getAlias();
node = selectExpressionItem.getExpression().getASTNode();
String columnName = "";
if(node != null){
Object value = node.jjtGetValue();
if (value instanceof Column) {
columnName = ((Column) value).getColumnName();
} else if (value instanceof Function) {
columnName = ((Function) value).toString();
} else {
// 增加对select 'aaa' from table; 的支持
if (value != null) {
columnName = value.toString();
columnName = columnName.replace("'", "");
columnName = columnName.replace("\"", "");
}
}
}
if (alias != null) {
columnName = alias.getName();
}
if(org.apache.dolphinscheduler.common.utils.StringUtils.isNotEmpty(columnName) && !result.contains(columnName)){
result.add(columnName);
}
} else if (selectItem instanceof AllTableColumns) {
allTableColumns = (AllTableColumns) selectItemlist.get(i);
if(!result.contains(allTableColumns.toString())){
result.add(allTableColumns.toString());
}
} else {
if(!result.contains(selectItem.toString())){
result.add(selectItem.toString());
}
}
}
}
}
} catch (JSQLParserException e) {
e.printStackTrace();
}
return result;
}