jsqlparser把转普通select语句转成查询数量的sql

98 阅读1分钟

废话少说,直接上代码:

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