开发者社区> 问答> 正文

druid sql parser如何提取和去掉SQL中的Schema

INSERT INTO testdb.Websites (name, country) SELECT app_name, country FROM testdb.apps; 转为 INSERT INTO Websites (name, country) SELECT app_name, country FROM apps;

原提问者GitHub用户dostar

展开
收起
山海行 2023-07-05 19:55:13 216 0
4 条回答
写回答
取消 提交回答
  • 使用Druid SQL解析器(如Apache Calcite),您可以提取和去除SQL语句中的Schema。

    要提取SQL语句中的Schema,您可以使用SQL解析器将SQL语句解析为抽象语法树(AST),然后从AST中提取所需的信息。以下是一个示例代码段,展示了如何使用Apache Calcite解析器来提取SQL语句中的Schema:

    import org.apache.calcite.sql.parser.SqlParseException;
    import org.apache.calcite.sql.parser.SqlParser;
    import org.apache.calcite.sql.SqlNode;
    import org.apache.calcite.sql.SqlIdentifier;
    
    public class ExtractSchemaExample {
        public static void main(String[] args) {
            String sql = "INSERT INTO testdb.Websites (name, country) SELECT app_name, country FROM testdb.apps";
    
            SqlParser parser = SqlParser.create(sql);
            try {
                SqlNode sqlNode = parser.parseQuery();
                if (sqlNode instanceof SqlIdentifier) {
                    SqlIdentifier identifier = (SqlIdentifier) sqlNode;
                    String schema = identifier.names.get(0); // 获取第一个标识符作为Schema
                    System.out.println("Schema: " + schema);
                }
            } catch (SqlParseException e) {
                System.out.println("Failed to parse SQL: " + e.getMessage());
            }
        }
    }
    

    以上代码将输出提取到的Schema:"testdb"。

    要删除SQL语句中的Schema,您可以在提取Schema后,构建一个新的SQL语句,仅包含表名而不包含Schema。以下是一个示例方法,用于演示如何去除SQL语句中的Schema:

    public static String removeSchemaFromSql(String sql) {
        SqlParser parser = SqlParser.create(sql);
        try {
            SqlNode sqlNode = parser.parseQuery();
            if (sqlNode instanceof SqlIdentifier) {
                SqlIdentifier identifier = (SqlIdentifier) sqlNode;
                // 去除第一个标识符(Schema)
                identifier.names.remove(0);
            }
            return sqlNode.toString();
        } catch (SqlParseException e) {
            System.out.println("Failed to parse SQL: " + e.getMessage());
            return sql; // 解析失败,返回原始SQL
        }
    }
    

    使用以上方法,您可以将提取到的Schema从原始SQL语句中删除,并获取不包含Schema的新SQL语句。

    请注意,Druid SQL解析器(如Apache Calcite)是一个功能强大的工具,用于解析和处理SQL语句。您可以根据具体情况进行适当的调整和扩展以满足您的需求。

    2023-07-30 15:12:25
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    在Druid SQL Parser中,Schema是SQL语句中的一个关键字,用于指定数据库的名称。在解析SQL语句时,可以使用SchemaStatVisitor来提取和去掉SQL中的Schema,具体步骤如下:

    首先,创建一个SchemaStatVisitor对象,用于解析SQL语句并提取其中的信息。例如:
    Copy
    String sql = "SELECT * FROM my_schema.my_table";
    SchemaStatVisitor visitor = new SchemaStatVisitor();
    在这个例子中,我们创建了一个SchemaStatVisitor对象,并指定要解析的SQL语句。

    接下来,使用accept方法将SQL语句传递给SchemaStatVisitor对象,并解析其中的信息。例如:
    Copy
    SQLStatementParser parser = new SQLStatementParser(sql);
    SQLStatement statement = parser.parseStatement();
    statement.accept(visitor);
    在这个例子中,我们使用SQLStatementParser来解析SQL语句,并将其传递给SchemaStatVisitor对象。然后,我们调用accept方法来解析SQL语句并提取其中的信息。

    最后,可以使用getSchema方法来获取SQL语句中指定的Schema名称,并使用removeSchema方法将其从SQL语句中去掉。例如:
    basic
    Copy
    String schema = visitor.getSchema();
    String sqlWithoutSchema = visitor.removeSchema(sql);
    在这个例子中,我们使用getSchema方法获取SQL语句中指定的Schema名称,并使用removeSchema方法将其从SQL语句中去掉。这样,我们就可以获取SQL语句中的Schema,并将其从SQL语句中去掉,以便进行后续的处理。

    2023-07-30 14:38:33
    赞同 展开评论 打赏
  • 要将SQL语句 "INSERT INTO testdb.Websites (name, country) SELECT app_name, country FROM testdb.apps;" 转换为 "INSERT INTO Websites (name, country) SELECT app_name, country FROM apps;",您只需去除表名前的数据库名即可。

    2023-07-11 09:45:02
    赞同 展开评论 打赏
  • String sql = "INSERT INTO testdb.Websites (name, country)\n" + "SELECT app_name, country FROM testdb.apps;";

    SQLStatement stmt = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL).get(0);

    SQLASTVisitor v = new MySqlASTVisitorAdapter() { @Override public boolean visit(SQLPropertyExpr x) { if (SQLUtils.replaceInParent(x, new SQLIdentifierExpr(x.getName()))) { return false; } return super.visit(x); } }; stmt.accept(v);

    assertEquals("INSERT INTO Websites (name, country)\n" + "SELECT app_name, country\n" + "FROM apps;", stmt.toString());

    原回答者GitHub用户wenshao

    2023-07-06 11:15:51
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载