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; 
 | 
    } 
 | 
}  
 |