应用druid在查问MySql with as 报如下错:
Error querying database. Cause: java.sql.SQLException: sql injection violation, syntax error: TODO. pos 782, line 25, column 5, token LPAREN : with g as ( 。。。
uncategorized SQLException; SQL state [null]; error code [0]; sql injection violation, syntax error: TODO. pos 782, line 25, column 5, token LPAREN : with g as (。。。
Caused by: com.alibaba.druid.sql.parser.ParserException: TODO. pos 782, line 25, column 5, token LPAREN

at com.alibaba.druid.sql.parser.SQLStatementParser.parseWith(SQLStatementParser.java:3336)at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:242)at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:182)at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:624)at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:578)at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:793)... 114 common frames omitted

从下面的Caused by:局部异样信息来看,是druid解析SQL报的错,残缺的SQL如下:
with g as (

        select            COUNT(IF(DATE_FORMAT(t.so_order_date, '%Y') = '2020', 1, NULL)) as c2020,            COUNT(IF(DATE_FORMAT(t.so_order_date, '%Y') = '2019', 1, NULL)) as c2019,            t.so_city_code        from (            SELECT                o.so_order_date,o.so_city_code,o.so_id            FROM                cor_service_order o            WHERE                o.so_order_date <= STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')                AND o.so_order_date >= STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')            UNION ALL            SELECT                d.so_order_date,d.so_city_code,d.so_id            FROM                cor_delete_order d            WHERE                d.robber_del_date IS NOT NULL                AND d.issuer_del_date IS NOT NULL                and d.so_order_date <= STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')                AND d.so_order_date >= STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')        ) t group by t.so_city_code    )    (select so_city_code,c2020,-1 c2019 from g order by g.c2020 desc limit 6)    union all    (select so_city_code,-1 c2020,c2019 from g order by g.c2019 desc limit 6)

这条SQL在MySql workbeach工具里能失常执行,最初发现druid在解析SQL时,如同SQL不能以右括号结尾,最初革新如下:
with g as (

        select            COUNT(IF(DATE_FORMAT(t.so_order_date, '%Y') = '2020', 1, NULL)) as c2020,            COUNT(IF(DATE_FORMAT(t.so_order_date, '%Y') = '2019', 1, NULL)) as c2019,            t.so_city_code        from (            SELECT                o.so_order_date,o.so_city_code,o.so_id            FROM                cor_service_order o            WHERE                o.so_order_date <= STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')                AND o.so_order_date >= STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')            UNION ALL            SELECT                d.so_order_date,d.so_city_code,d.so_id            FROM                cor_delete_order d            WHERE                d.robber_del_date IS NOT NULL                AND d.issuer_del_date IS NOT NULL                and d.so_order_date <= STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')                AND d.so_order_date >= STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')        ) t group by t.so_city_code    )    select * from (select so_city_code,c2020,-1 c2019 from g order by g.c2020 desc limit 6) g1    union all    select * from (select so_city_code,-1 c2020,c2019 from g order by g.c2019 desc limit 6) g2

看最初的union all中两条select 中的“select * from ”局部是新增加的,让SQL不以右括号结尾即可解决问题。