小编Pio*_*ana的帖子

apache calcite 区分列名和表名

我正在实现一个简单的应用程序,它可以更改 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)

java sql parsing apache-calcite

5
推荐指数
1
解决办法
3576
查看次数

标签 统计

apache-calcite ×1

java ×1

parsing ×1

sql ×1