You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SqlWriterConfig优雅移除Calcite解析结果中的引号

配置SqlWriterConfig移除多余反引号的方法

直接在构建SqlWriterConfig时关闭全标识符自动加引号的开关即可,参考代码如下:

import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlPrettyWriter;
import org.apache.calcite.sql.SqlWriterConfig;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
import org.apache.calcite.util.Casing;

public class SqlParseUtil {
    public static String getSqlWithoutExtraQuote(SqlNode parsedSqlNode) {
        SqlWriterConfig config = SqlPrettyWriter.config()
                // 核心配置:关闭所有标识符强制加引号
                .withQuoteAllIdentifiers(false)
                // 保留原始标识符大小写,不自动做大小写转换
                .withUnquotedCasing(Casing.UNCHANGED)
                .withQuotedCasing(Casing.UNCHANGED)
                // 按需匹配你使用的数据库方言,不同数据库的引号规则存在差异
                .withConformance(SqlConformanceEnum.DEFAULT);
        return parsedSqlNode.toSqlString(config).getSql();
    }
}

配置项说明

  • withQuoteAllIdentifiers(false):关闭后仅当标识符存在SQL语法冲突(比如和保留字重名、包含空格/特殊字符)时才会添加引号,普通表名、字段名不会被多余反引号包裹
  • withUnquotedCasing/withQuotedCasing:分别控制无引号、带引号标识符的输出大小写规则,设置为Casing.UNCHANGED会和你原始建表语句的大小写保持一致,不会自动转全大/全小写
  • withConformance:指定SQL方言兼容级别,比如适配MySQL可选择SqlConformanceEnum.MYSQL_5,适配ANSI SQL可选择默认配置,避免方言差异导致的引号格式不符合预期

注意:如果你的字段名、表名本身和SQL保留字冲突,或者包含特殊符号、空格,即使关闭全量加引号配置,这类标识符依然会被自动添加引号,属于保证SQL语法合法的正常处理,不属于多余引号。

内容的提问来源于stack exchange,提问作者slo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:51:42