【正则】构造复杂SQL语句的正则表达式1

本文介绍了一种使用正则表达式分析和校验SQL语句的方法,包括提取表名、字段名及过滤条件等内容。通过粗粒度与细粒度划分,构建完整的SQL正则表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前做人口数据库时经常写些比较长的SQL语句,最长至上百行,看懂也得半天,恰巧在项目中遇见需要提取其中的条件子句,那时对正则也研究了一下,所以就顺便用正则写了个SQL语句分析、校验工具。正则表达式一般用在验证模式中,但个人认为验证只是正则的功能之一,在文本数据处理中才能发挥它的真正作用。利用正则表达式校验分析SQL语句,对于日常开发中,可能有简单问题复杂化之嫌,但这属于一个学习SQL和正则的绝佳机会。

【问题】先提出一个很简单的问题:如何提取Select语句中的使用的表和字段,以及过滤条件?

select count(distinct pis_p_renk_1.sysid) as result,
       pis_p_renk.juzhd as address,
       pis_p_guanlshx.guanlshx as guanlshx,
       pis_p_renk.hukxzh as hukxzh
  from pis_p_renk,
       pis_p_guanlshx,
       pis_p_zhuxyy,
       pis_p_zinshx,
       pis_p_guanx,
       pis_p_renk as pis_p_renk_1
 where pis_p_renk.sysid = pis_p_guanlshx.renkid
   and pis_p_renk.sysid = pis_p_zhuxyy.renkid
   and pis_p_renk_1.sysid = pis_p_guanx.renkid
   and pis_p_renk.sysid = pis_p_guanx.guanxrid
   and pis_p_guanx.sysid = pis_p_zinshx.guanxid
   and pis_p_guanx.guanxlx =
'2'

   and pis_p_renk_1.xingb =
'2'
   and substr(pis_p_renk.chushrq,
1, 6) between substr('@StartTime', 1, 6) and
       substr(
'@EndTime', 1, 6
)
   and pis_p_guanlshx.dangq =
'1'

   and (pis_p_guanlshx.guanlshxbdshj =
'' or
       pis_p_guanlshx.guanlshxbdshj is null or
       pis_p_guanlshx.guanlshxbdshj is null or
       substr(pis_p_guanlshx.guanlshxbdshj,
1, 6
) <=
       substr(pis_p_renk.chushrq,
1, 6
))
   and pis_p_renk.juzhd like
'@Address%'

   and pis_p_zinshx.zinshx not in (
'3', '4', '8')
   and pis_p_renk.zhengcnw =
'5'

   and pis_p_renk.xingb =
'2'

(一)以下是概括分析思路:

Select语句中各组成部分进行粗粒度、细粒度划分,然后将细粒度部分匹配正则表达式,再将细粒度合成粗粒度部分,最后组成完整正则表达式,可以校验语句,在正则捕获中可以获取各组成部分。

SQL正则构建工具:用于粗粒度、细粒度正则匹配。

工具

SQL语句分析工具:分析SQL语句各组成部分。

工具2

(二)语句构造粗粒度分析(待续)

(三)细粒度正则匹配

 

(四)完整正则表达式搭建

(五)SQL正则分析过程

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值