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