如何提取SQL字符串中单引号包裹的自定义列名内容
提取SQL中AS后单引号包裹的自定义列名方法
实现步骤
- 第一步:截取FROM之前的SELECT子句片段
你已经完成了SQL拆分,取拆分后的第一个元素即可,排除后续JOIN、WHERE等片段中无关单引号的干扰:String selectPart = sqlRequest.split("FROM")[0]; - 第二步:用正则表达式匹配目标内容
基础场景可以直接用正则'([^']+)'匹配所有单引号包裹的内容,如果要避免误匹配SELECT子句中的普通字符串常量,只精准匹配AS关键字后的别名,可以调整为正则AS\\s*'([^']+)',捕获组1即为你需要的自定义列名。
完整代码示例:
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SqlAliasExtractor { public static void main(String[] args) { // 测试用SQL示例 String sql1 = "SELECT COUNT(project_id) AS 'count', project.name AS 'projects' FROM test JOIN project ON project_id = project.id"; String sql2 = "SELECT count(*) AS 'browsers' FROM `test`"; List<String> aliases1 = extractAliases(sql1); List<String> aliases2 = extractAliases(sql2); // 输出结果分别为 [count, projects] 和 [browsers] System.out.println(aliases1); System.out.println(aliases2); } private static List<String> extractAliases(String sqlRequest) { List<String> aliases = new ArrayList<>(); String selectPart = sqlRequest.split("FROM")[0]; // 精准匹配AS后的单引号别名,避免误抓普通字符串 Pattern pattern = Pattern.compile("AS\\s*'([^']+)'", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(selectPart); while (matcher.find()) { aliases.add(matcher.group(1)); } return aliases; } }
如果业务场景存在别名带转义单引号(SQL中用两个连续单引号表示单引号本身)、别名用双引号/反引号包裹的情况,对应调整正则规则即可适配。
内容的提问来源于stack exchange,提问作者Денис Задорожний
相关产品推荐
相关产品推荐

