Oracle 查询字符串中子字符串的数量

项目场景:

数据库表 A 有个表达式字段 Express,用于存储业务逻辑表达式,且表达式中 形如 [A]=[B]+[C].-1形式;
数据库表 B 用于存储表达式解析后的明细数据,表达式中的每个单元会单独解析为一条记录存在表B中;上文中的表达式 A=B+C.-1 会在B表中解析为三条记录 A,B,C;
表A与表B关联条件:A.ID = B.ExpressionID

之前程序有bug导致 [C].-1 未正确解析,所有需要把表A中有问题的表达式查询出来。

sql逻辑:
检查表达式中有多少个右方括号字符 ] ,代表有多少个单元;
查询表B中有多少条记录,记为Flag;
如果表达式中右方括号数量大于B表中的数据数量,则为目标表达式
其中,查询右方括号的关键sql为 
LENGTH(Expression) - LENGTH(REPLACE(Expression, ']', ''))

完整查询sql

SELECT REPORTINFO.Code, REPORTINFO.Name, Expression
  FROM A
  JOIN (SELECT COUNT(1) Flag, B.ExpressionID
          FROM B
         WHERE B.ExpressionID IN
               (SELECT A.ID
                  FROM A
                 WHERE A.Category = '12effafa-a448-406e-8114-f4769a1f8021'
                   AND REGEXP_LIKE(Expression, '\.-'))
         GROUP BY B.ExpressionID) Temp
    ON Temp.ExpressionID = A.ID
   AND (LENGTH(Expression) - LENGTH(REPLACE(Expression, ']', ''))) >= Flag
  JOIN REPORTINFO
    ON REPORTINFO.ReportID = A.ReportID
 WHERE Category = '12effafa-a448-406e-8114-f4769a1f8021'
   AND REGEXP_LIKE(Expression, '\.-')
 ORDER BY REPORTINFO.Code
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值