项目场景:
数据库表 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