支持复杂的sql吗?比如多表join
时间: 2023-07-07 21:30:42 浏览: 48
是的,以上代码只提取了简单的 SQL 语句中的表名和字段名,如果 SQL 语句是复杂的,例如包含多个表的 JOIN 或子查询等,需要相应地修改正则表达式来匹配更复杂的 SQL 语句。
以下是一个示例,可以处理包含多个表的 JOIN 的 SQL 语句中的表名和字段名:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SqlParser {
// 正则表达式,用于匹配 SQL 语句中的表名和字段名
private static final Pattern TABLE_NAME_PATTERN = Pattern.compile("(?i)FROM\\s+(\\w+)(\\s+(?i)(LEFT|RIGHT|INNER)\\s+JOIN\\s+(\\w+)\\s+ON\\s+(\\w+\\.\\w+\\s*=\\s*\\w+\\.\\w+))+");
private static final Pattern COLUMN_NAME_PATTERN = Pattern.compile("(?i)SELECT\\s+(.*)\\s+(?i)FROM");
/**
* 从 SQL 语句中提取表名
*
* @param sql SQL 语句
* @return 表名列表
*/
public static List<String> getTableNames(String sql) {
Matcher matcher = TABLE_NAME_PATTERN.matcher(sql);
List<String> tableNames = new ArrayList<>();
if (matcher.find()) {
// 匹配到第一个表名
tableNames.add(matcher.group(1));
// 匹配其他表名
String joinClause = matcher.group(0);
Matcher joinMatcher = Pattern.compile("(?i)(LEFT|RIGHT|INNER)\\s+JOIN\\s+(\\w+)\\s+ON\\s+(\\w+\\.\\w+\\s*=\\s*\\w+\\.\\w+)").matcher(joinClause);
while (joinMatcher.find()) {
tableNames.add(joinMatcher.group(2));
}
}
return tableNames;
}
/**
* 从 SQL 语句中提取字段名列表
*
* @param sql SQL 语句
* @return 字段名列表
*/
public static List<String> getColumnNames(String sql) {
Matcher matcher = COLUMN_NAME_PATTERN.matcher(sql);
List<String> columnNames = new ArrayList<>();
if (matcher.find()) {
String[] columns = matcher.group(1).split(",");
for (String column : columns) {
columnNames.add(column.trim());
}
}
return columnNames;
}
}
```
使用方法:
```java
String sql = "SELECT u.id, u.name, o.order_no FROM users u INNER JOIN orders o ON u.id = o.user_id WHERE u.id = 1";
List<String> tableNames = SqlParser.getTableNames(sql); // tableNames = ["users", "orders"]
List<String> columnNames = SqlParser.getColumnNames(sql); // columnNames = ["u.id", "u.name", "o.order_no"]
```
请注意,这里的正则表达式只是一个示例,如果需要处理更多类型的 SQL 语句,需要根据实际情况调整正则表达式。