【sql】sql中with as 介绍与使用jsqlparser解析sql

一. 定义

with A as (select * from class)

也就是将重复用到的大批量 的SQL语句,放到with as 中,加一个别名,在后面用到的时候就可以直接用。对于大批量的SQL数据,起到优化的作用。

with子句的返回结果存到用户的临时表空间中,只做一次查询,反复使用,提高效率。

 

二. 用法

  1. with子句只能被select查询块引用
  2. 在同级select前有多个查询定义的时候,第1个用with,后面的不用with,并且用逗号隔开。
  3. 最后一个with 子句与下面的查询之间不能有逗号,只通过右括号分割,with 子句的查询必须用括号括起来。

-- 针对一个别名
-- –相当于建了个e临时表

with e as (select * from scott.emp e where e.empno=7499)
select * from e;

-- –针对多个别名,相当于建了e、d临时表

with
e as (select * from scott.emp),
d as (select * from scott.dept)
select * from e, d where e.deptno = d.deptno;

 

三. 解析


<dependency>  
  <groupId>com.github.jsqlparser</groupId>  
  <artifactId>jsqlparser</artifactId>  
  <version>4.9</version>  
</dependency>

官网文档:

https://jsqlparser.github.io/JSqlParser/usage.html#parse-a-sql-statements

//去除 with语法下的别名
private static Set<String> removeWithAlias(String sql, Set<String> tables) {  
    if (sql.contains("with ")) {  
        PlainSelect select = null;  
        try {  
            select = (PlainSelect) CCJSqlParserUtil.parse(sql);  
            List<WithItem> withItemsList = select.getWithItemsList();  
            List<String> withAlias = withItemsList.stream()  
                    .map(withItem -> withItem.getAlias().getName())  
                    .collect(Collectors.toList());  
            return tables.stream().filter(t -> !withAlias.contains(t))  
                    .collect(Collectors.toSet());  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    return tables;  
}

 

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用jsqlparser解析子查询sql的示例代码: ```java import java.io.StringReader; import java.util.List; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SubSelect; public class JSqlParserDemo { public static void main(String[] args) throws JSQLParserException { String sql = "SELECT * FROM (SELECT * FROM table1 WHERE id IN (SELECT id FROM table2)) AS subquery"; Statement statement = CCJSqlParserUtil.parse(sql); Select selectStatement = (Select) statement; PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody(); SubSelect subSelect = (SubSelect) plainSelect.getFromItem(); Select subquery = (Select) subSelect.getSelectBody(); PlainSelect subqueryPlainSelect = (PlainSelect) subquery.getSelectBody(); List<Expression> expressions = subqueryPlainSelect.getSelectItems(); for (Expression expression : expressions) { System.out.println(expression.toString()); } } } ``` 上述代码,我们首先将子查询sql语句作为字符串传入JSqlParser进行解析。然后,我们通过获取Select对象和PlainSelect对象来获取子查询的Select对象和PlainSelect对象。最后,我们可以通过获取子查询的PlainSelect对象来获取子查询的Select字段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值