Browse Source

获取 sql 查询结果数时,对 union 进行处理

sunyj 8 years ago
parent
commit
44b70cd070
1 changed files with 6 additions and 3 deletions
  1. 6 3
      src/main/java/com/uas/report/service/impl/PrintServiceImpl.java

+ 6 - 3
src/main/java/com/uas/report/service/impl/PrintServiceImpl.java

@@ -762,14 +762,17 @@ public class PrintServiceImpl implements PrintService {
 		try {
 			// 如果直接在 sql 外用 count(1) 统计数目,当关联表多时,可能会出现错误
 			// ORA-01792: 表或视图中的最大列数为 1000
-			// 报错主要发生在 select * 的情况下,但是不能这样判断,因为可能存在 select tt.*, pi_id from
-			// purchase t left join 这样的情况,很难区分
+			// 报错主要发生在 select * 的情况下,但是不能这样判断,因为可能存在
+			// 1. select tt.*, pi_id from purchase t left join
+			// 2. union 这样的情况,很难区分
 			// 因此 1. 对于普通 sql ,将 select 后的字段改为 count(1)
 			// 2. 而最外层含有 group by 的 sql ,直接改为 count(1) 可能得到不止一行,结果也并非实际行数。再加上
 			// group
 			// by 的结果列数一般很小,所以可以在外面使用 count(1) ,一般不会超出 1000 行
+			// 3. union 外层使用 count(1)
 			String lowerSql = sql.toLowerCase();
-			if (!lowerSql.matches("[\\s\\S]+?group[\\s]+?by[\\s]+?[^)]+?")) {
+			if (!lowerSql.matches("[\\s\\S]+?group[\\s]+?by[\\s]+?[^)]+?")
+					&& !lowerSql.matches("[\\s\\S]+?[\\s]+?union[\\s]+?[\\s\\S]+?")) {
 				String regex = "([\\s\\S]+?from)[\\s]+?[^,]+?";
 				Pattern pattern = Pattern.compile(regex);
 				Matcher matcher = pattern.matcher(lowerSql);