使用正则 处理SQL语句--呼叫 lxcnn (过客)............
要实现的是,要把某条sql语句中的指定表名替换为预先准备好的sql语句。
比如,原始sql:select * from mproduct
要把mproduct替换为(select * from mproduct where 1=2)
最后出来的:select * from (select * from mproduct where 1=2)
关键是原始的SQL可能会很复杂,我列了下面几种情况:
select * from m_product; 最基本
select * from m_product ; 表名前后有空格,没有别名
select * from m_product m; 有别名
select * from m_product m,m_product_category a where m.ad_client_id=a.ad_client_id;
select m.ad_client_id from m_product m; 有别名,使用别名.字段
select * from m_product where m_product.ad_client_id=300000 ; where条件使用表名.字段
select m_product.id from m_product; 使用表名.字段
select m_product.ad_client_id from m_product,m_product_category a where m_product.ad_client_id=a.ad_client_id;
select * from m_product m_product,m_product_category where m_product.ad_client_id=300000 别名与表名相同
select * from ( select * from m_product) m_product,m_subtitute m where m_product.ad_client_id=m.ad_client_id 子查询的别名和表名相同
绿色显示的应该是被替换的,红色显示的应该是无需替换的。
情况可能还有许多,这里就列这几个。 这种正则该怎么写?
呼叫 lxcnn (过客)............
------解决方案--------------------
C# code
string str = "select * from m_product where m_product.ad_client_id=300000 ;";
Regex reg = new Regex(@"(?is)(?<=from(.(?!where))+)(?<!\)\s+)m_product(?=(\s|;|$|,|\)))");
str = reg.Replace(str, "(select * from mproduct where 1=2)");
------解决方案--------------------
C# code
//抛砖引玉:
string sql=@"...";
Regex reg=new Regex(@"m_product\b(?!\.)");
sql=reg.Replace(sql,"(select * from $0 where 1=2)",1);