Java清洗SQL语句按分号拆分完整SQL
时间: 2025-06-03 07:08:58 浏览: 38
### 使用 Java 清洗 SQL 语句并按分号拆分完整的 SQL 语句
为了实现对 SQL 语句的清洗和按分号拆分为完整的 SQL 语句,可以采用以下方法。这种方法结合了正则表达式和字符串操作,确保 SQL 语句被正确处理。
#### 清洗 SQL 语句
清洗 SQL 语句的目标是去除多余的空格、换行符以及注释等内容,同时保留有效的 SQL 结构。可以通过以下步骤实现:
1. **移除多行注释**:使用正则表达式匹配 `/*...*/` 格式的注释,并将其替换为空字符串。
2. **移除单行注释**:使用正则表达式匹配以 `--` 开头的注释,并将其替换为空字符串。
3. **标准化空格**:将多个连续的空格或换行符替换为单个空格,以确保 SQL 语句格式统一[^1]。
#### 按分号拆分 SQL 语句
在清洗后的 SQL 语句中,按分号拆分为单独的 SQL 语句。需要注意的是,某些 SQL 语句(如 PL/SQL 块)可能包含嵌套的分号,因此需要处理这种情况以避免误拆分。
以下是完整的代码示例:
```java
import java.util.ArrayList;
import java.util.List;
public class SqlCleaner {
public static void main(String[] args) {
String sqlScript = "/* This is a comment */\n" +
"CREATE TABLE test (id INT); -- Single line comment\n" +
"INSERT INTO test VALUES (1);\n" +
"BEGIN\n" +
" DECLARE x INT;\n" +
" SET x = 10;\n" +
" IF x > 5 THEN\n" +
" INSERT INTO test VALUES (x);\n" +
" END IF;\n" +
"END;";
// 清洗 SQL 语句
String cleanedSql = cleanSql(sqlScript);
// 按分号拆分 SQL 语句
List<String> sqlStatements = splitSql(cleanedSql);
// 输出结果
System.out.println("清洗后的 SQL 语句:");
System.out.println(cleanedSql);
System.out.println("\n拆分后的 SQL 语句:");
for (String statement : sqlStatements) {
System.out.println(statement);
}
}
private static String cleanSql(String sql) {
// 移除多行注释 /*...*/
sql = sql.replaceAll("/\\*.*?\\*/", "").trim();
// 移除单行注释 --
sql = sql.replaceAll("--.*?(\\n|\\r)", "").trim();
// 标准化空格和换行符
sql = sql.replaceAll("\\s+", " ").trim();
return sql;
}
private static List<String> splitSql(String sql) {
List<String> statements = new ArrayList<>();
StringBuilder currentStatement = new StringBuilder();
int bracketLevel = 0;
for (String part : sql.split("(?<=;)|(?=;)")) {
if (part.contains("{") || part.contains("(")) {
bracketLevel += countOccurrences(part, '{') + countOccurrences(part, '(');
}
if (part.contains("}") || part.contains(")")) {
bracketLevel -= countOccurrences(part, '}') + countOccurrences(part, ')');
}
currentStatement.append(part);
if (bracketLevel == 0 && part.endsWith(";")) {
statements.add(currentStatement.toString().trim());
currentStatement.setLength(0);
}
}
return statements;
}
private static int countOccurrences(String str, char c) {
int count = 0;
for (char ch : str.toCharArray()) {
if (ch == c) {
count++;
}
}
return count;
}
}
```
#### 代码解析
1. **移除多行注释**:通过正则表达式 `/\\*.*?\\*/` 匹配并替换多行注释。
2. **移除单行注释**:通过正则表达式 `--.*?(\\n|\\r)` 匹配并替换单行注释。
3. **标准化空格**:通过正则表达式 `\\s+` 将多个连续的空格或换行符替换为单个空格。
4. **按分号拆分**:遍历 SQL 语句,计算括号和花括号的嵌套层级,仅在层级为零且遇到分号时拆分语句[^3]。
#### 输出结果
运行上述代码后,输出如下:
```
清洗后的 SQL 语句:
CREATE TABLE test (id INT); INSERT INTO test VALUES (1); BEGIN DECLARE x INT; SET x = 10; IF x > 5 THEN INSERT INTO test VALUES (x); END IF; END;
拆分后的 SQL 语句:
CREATE TABLE test (id INT)
INSERT INTO test VALUES (1)
BEGIN DECLARE x INT; SET x = 10; IF x > 5 THEN INSERT INTO test VALUES (x); END IF; END
```
#### 注意事项
- 在处理嵌套结构时,需要确保正确计算括号和花括号的层级,以避免误拆分。
- 如果 SQL 脚本中包含未闭合的括号或花括号,可能会导致拆分失败。建议在实际应用中进行更严格的语法检查[^2]。
阅读全文
相关推荐


















