package com.ruoyi.common.utils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * SQL语法转换工具类 */ @Component public class SqlConverter { @Value("${spring.datasource.druid.master.driverClassName}") private String driverClassName; /** * 转换SQL语法 * @param sql 原始SQL * @return 转换后的SQL */ public String convertSql(String sql) { // 判断是否是高斯数据库 if (isGaussDB()) { return convertToGaussSql(sql); } return sql; } /** * 判断是否是高斯数据库 */ private boolean isGaussDB() { return driverClassName.contains("postgresql"); } /** * 将MySQL语法转换为高斯数据库语法 */ private String convertToGaussSql(String sql) { if (sql == null || sql.trim().isEmpty()) { return sql; } // 转换LIMIT语法 sql = sql.replaceAll("LIMIT\\s+(\\d+)\\s*,\\s*(\\d+)", "LIMIT $2 OFFSET $1"); // 转换日期函数 sql = sql.replaceAll("DATE_FORMAT\\(([^,]+),\\s*'%Y-%m-%d'\\)", "TO_CHAR($1, 'YYYY-MM-DD')"); sql = sql.replaceAll("DATE_FORMAT\\(([^,]+),\\s*'%Y-%m-%d %H:%i:%s'\\)", "TO_CHAR($1, 'YYYY-MM-DD HH24:MI:SS')"); // 转换字符串连接 sql = sql.replaceAll("CONCAT\\(([^)]+)\\)", "CONCAT_WS('', $1)"); // 转换IFNULL函数(忽略大小写) sql = sql.replaceAll("(?i)ifnull\\(([^,]+),\\s*([^)]+)\\)", "coalesce($1, $2)"); // 转换NOW()函数 sql = sql.replaceAll("NOW\\(\\)", "CURRENT_TIMESTAMP"); // 替换 sysdate() 为 CURRENT_TIMESTAMP sql = sql.replaceAll("sysdate\\(\\)", "CURRENT_TIMESTAMP"); // 去除所有反引号 sql = sql.replaceAll("`", ""); // 转换GROUP_CONCAT_WS为string_agg(忽略大小写) sql = sql.replaceAll("(?i)group_concat_ws\\s*\\(([^,]+),\\s*([^)]+)\\)", "string_agg($2, $1)"); return sql; } }