liusheng
3 天以前 c62e26954e41360fc6a2efc874815aa84f8b0073
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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;
    }