提取SQL中的表名称与列名称

 1、增加pom依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${druid.version}</version>
</dependency>
<druid.version>1.2.9</druid.version>
import com.alibaba.druid.DbType;
        import com.alibaba.druid.sql.SQLUtils;
        import com.alibaba.druid.sql.ast.SQLStatement;
        import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
        import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
        import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
        import com.alibaba.druid.sql.dialect.hive.ast.HiveInsertStatement;
        import com.alibaba.druid.sql.dialect.hive.visitor.HiveSchemaStatVisitor;
        import com.alibaba.druid.stat.TableStat;
        import lombok.extern.slf4j.Slf4j;

        import java.util.*;

/**
 * @Description SQL工具类
 * @Author 木
 * @Date 2022/5/6 18:38
 */
@Slf4j
public class SqlUtils {

    public static List<String> getTableNameList(String sql) {
        List<String> res = new ArrayList<>();
        try {
            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql, DbType.hive);
            for (SQLStatement sqlStatement : sqlStatements) {
                HiveSchemaStatVisitor sqlastVisitor = new HiveSchemaStatVisitor();
                if (sqlStatement instanceof SQLSelectStatement) {
                    SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) sqlStatement;
                    sqlSelectStatement.accept(sqlastVisitor);
                } else if (sqlStatement instanceof HiveInsertStatement) {
                    HiveInsertStatement sqlInsertStatement = (HiveInsertStatement) sqlStatement;
                    sqlInsertStatement.accept(sqlastVisitor);
                } else if (sqlStatement instanceof SQLDeleteStatement) {
                    SQLDeleteStatement sqlDeleteStatement = (SQLDeleteStatement) sqlStatement;
                    sqlDeleteStatement.accept(sqlastVisitor);
                }else if (sqlStatement instanceof SQLAlterTableStatement) {
                    SQLAlterTableStatement sqlAlterTableStatement = (SQLAlterTableStatement) sqlStatement;
                    sqlAlterTableStatement.accept(sqlastVisitor);
                }
                //获取表列表
                Map<TableStat.Name, TableStat> tables = sqlastVisitor.getTables();
                for (Map.Entry<TableStat.Name, TableStat> nameTableStatEntry : tables.entrySet()) {
                    res.add(nameTableStatEntry.getKey().getName());
                }
                //获取列列表
                Collection<TableStat.Column> columnCollection =  sqlastVisitor.getColumns();
                columnCollection.forEach(column->{
                    log.info("tableName:{},columnName:{},iswhere:{}",column.getTable(),column.getName(),column.isWhere());
                });
            }
        } catch (Exception e) {
            log.error("sql解析错误sql:{},错误原因:{}", sql, e.getMessage());
            if (e.getMessage().contains("token IDENTIFIER serdeproperties")) {
                String tempSql = sql.replaceAll(" ","").toLowerCase(Locale.ROOT);
                int start = tempSql.indexOf("altertable") + 10;
                int end = tempSql.indexOf("setserdeproperties(");
                res.add(tempSql.substring(start, end));
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String sql = "select * from dba.test where AVAILABLE = '0'";
        System.out.println(getTableNameList(sql));
    }
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值