废话少说,直接上代码:
package com.tyzou.test;
import cn.hutool.core.collection.ListUtil;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SelectItem;
public class SqlUtils {
public static String convertToCountQuery(String sql) {
// 使用正则表达式进行不区分大小写的替换
return sql.replaceAll("(?i)SELECT\s+.+?\s+FROM", "SELECT COUNT(*) FROM");
}
public static String convertToCountQuery2(String sql) {
PlainSelect select = null;
try {
select = (PlainSelect) CCJSqlParserUtil.parse(sql);
SelectItem count = new SelectItem();
count.setExpression(new Column("COUNT(*)"));
count.setAlias(new Alias("CNT"));
select.setSelectItems(ListUtil.of(count));
return select.toString();
} catch (JSQLParserException e) {
e.printStackTrace();
}
return "";
}
public static void main(String[] args) throws JSQLParserException {
String sql1 = "SELECT name, age FROM users WHERE age > 18";
String sql2 = "select name, age from users where age > 18";
String sql3 = "SELECT name, age fROM users WHERE age > 18";
System.out.println("Count Query 1: " + convertToCountQuery2(sql1));
System.out.println("Count Query 2: " + convertToCountQuery2(sql2));
System.out.println("Count Query 3: " + convertToCountQuery2(sql3));
}
}
输出结果:
Count Query 1: SELECT COUNT(*) AS CNT FROM users WHERE age > 18
Count Query 2: SELECT COUNT(*) AS CNT FROM users WHERE age > 18
Count Query 3: SELECT COUNT(*) AS CNT FROM users WHERE age > 18