我正在实现一个简单的应用程序,它可以更改 SQL 语句中的列名称(并保留表名称)。该语句作为 a 传递String,修改后的语句也作为 a 返回String,不涉及数据库连接。
为了实现这一点,我使用 Apache Calcite 的 SQL 解析器。我将 SQL 字符串解析为SqlNode,接受SqlVisitor创建重命名的SqlNode,然后将所有内容写回String(使用SqlNode.toSqlString())。
问题是我不知道如何在SqlNode接受SqlVisitor. 两者都表示为SqlIdentifier, 具有相同的SqlKind。因此,当SqlVisitor访问 时SqlIdentifier,它会重命名它,无论它是列还是表。
private String changeNames(String str) throws SqlParseException {
SqlShuttle visitor = new SqlShuttle() {
private String rename(String str) {
return str + "-test";
}
@Override
public SqlNode visit(SqlIdentifier identifier) {
SqlIdentifier output = new SqlIdentifier(rename(identifier.getSimple()), identifier.getCollation(), …Run Code Online (Sandbox Code Playgroud)