【正则】构造复杂SQL语句的正则表达式1
2010-10-29 09:13
363 查看
以前做人口数据库时经常写些比较长的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语句各组成部分。
(二)语句构造粗粒度分析(待续)
(三)细粒度正则匹配
(四)完整正则表达式搭建
(五)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语句各组成部分。
(二)语句构造粗粒度分析(待续)
(三)细粒度正则匹配
(四)完整正则表达式搭建
(五)SQL正则分析过程
相关文章推荐
- 【正则】构造复杂SQL语句的正则表达式2(粗粒度分析)
- 【正则】构造复杂SQL语句的正则表达式3(细粒度正则匹配)
- SQL语句--like和正则表达式的使用
- SQL语句正则表达式 匹配(获取) 所有表名
- Mysql sql语句回顾2 --正则表达式
- 分析sql语句所有表名及其别名的正则表达式
- 如何在SQL语句中使用正则表达式
- sql语句like的用法 有些正则表达式可以通过like实现
- python正则表达式匹配sql语句中的表名
- SQL语句与正则表达式
- 正则表达式提取sql语句的@参数名,顺便修正subsonic的一个bug
- SQL语句与正则表达式
- 应该如何构造复杂的正则表达式
- 网站发帖防注入SQL语句之UBB翻译(正则表达式)
- 应该如何构造复杂的正则表达式
- 在SQL语句中使用正则表达式
- 使用UE 正则表达式 查找siebel log文件 sql耗时较长的语句
- 复杂的正则表达式应该如何构造
- 在Sql语句中使用正则表达式来查找你所要的字符 及调试问题
- sql语句like的用法 有些正则表达式可以通过like实现