sql解析代码

代码片(直接复制粘贴使用即可)

/**
   * 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;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值