日期:2014-05-20  浏览次数:20901 次

使用正则 处理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);