一条SQL的改写

最近需求中需要实现这样一个功能

找主活动是未锁定的,且已确认的子活动数据,表中数据的分布是这样的

表中数据存放结构
                主活动1   没锁定
                子活动 主11  已确认
                子活动 主22  已确认
                主活动2    锁定
                子活动 主21  未确认
                子活动 主22  已确认

            1用 NOT EXIST实现

                SELECT T1.ATTR01, T1.ATTR04, T1.MEM_NM
                FROM CHNQLTOWN.3pl T1
                WHERE T1.确认否=TO_CHAR(TRUNC(SYSDATE-1),'YYYYMMDD')
                AND  NOT EXISTS(SELECT 1 FROM 3PL T2 WHERE T2.STAGE IN ('INIT','OVER')

                AND  T1.WEC_OPN_ID=T2.WEC_OPN_ID AND T1.MEM_ID=T1.MEM_ID AND T2.锁定否='Y')

            2 用关联查询
                
                SELECT T1.ATTR01, T1.ATTR04, T1.MEM_NM
                FROM  CHNQLTOWN.3pl T1
                    , CHNQLTOWN.3pl T2
                WHERE T1.WEC_OPN_ID=T2.WEC_OPN_ID AND T1.MEM_ID=T2.MEM_ID
                AND T2.STAGE IN ('INIT','OVER') AND T2.锁定否= 'N'
                AND T1.确认否=TO_CHAR(TRUNC(SYSDATE-1),'YYYYMMDD')

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/750077/viewspace-2104810/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/750077/viewspace-2104810/

### 使用 JSQLParser 修改或重构 SQL 查询 #### 解析并修改 SQL 语句 JSqlParser 是一款强大的 Java 库,能够解析 SQL 并提供 API 来访问和修改查询的不同部分。下面是一个基本的例子来展示如何加载一条 SELECT 语句,对其进行更改,并重新构建它。 ```java import net.sf.jsqlparser.JSQLParserException; 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; public class SqlModifier { public static void main(String[] args) throws JSQLParserException { String sql = "SELECT id, name FROM users WHERE age > 30"; Statement statement = CCJSqlParserUtil.parse(sql); Select selectStatement = (Select) statement; PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody(); // 添加新列到选择列表中 plainSelect.setSelectItems(Arrays.asList( new SelectExpressionItem(CCJSqlParserUtil.parseExpression("id")), new SelectExpressionItem(CCJSqlParserUtil.parseExpression("name")), new SelectExpressionItem(CCJSqlParserUtil.parseExpression("email")) )); // 更改表名 plainSelect.setFromItem(new Table("customer")); System.out.println(selectStatement.toString()); } } ``` 这段代码展示了怎样向 `SELECT` 列表增加新的字段以及改变数据源的名字[^1]。 #### 处理复杂情况下的 SQL 改写 对于更复杂的场景,比如处理子查询或是多层嵌套的情况,则需要深入理解 AST(Abstract Syntax Tree 抽象语法树) 的结构。可以遍历整个表达式树,在适当的位置插入、删除节点或者替换它们的内容。 例如要给所有的条件加上额外的过滤: ```java // 假设有一个 where 子句已经存在 if (plainSelect.getWhere() != null){ And andExpression = new And(); andExpression.setLeftExpression(plainSelect.getWhere()); andExpression.setRightExpression(CCJSqlParserUtil.parseExpression("status='active'")); plainSelect.setWhere(andExpression); } else { // 如果没有where子句则直接设置一个新的 plainSelect.setWhere(CCJSqlParserUtil.parseExpression("status='active'")); } ``` 此片段说明了当遇到已有 `WHERE` 子句时应如何安全地附加更多逻辑运算符而不破坏原有条件[^2]。 通过上述方法,可以根据具体需求灵活调整 SQL 文本中的各个组成部分,无论是简化还是增强原始查询的功能都变得可行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值