如何通过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
相关产品推荐
相关产品推荐

