【问题标题】:I need the Regular Expression For Replacing Characters in a SQL Statement我需要用于替换 SQL 语句中字符的正则表达式
【发布时间】:2013-05-03 13:54:09
【问题描述】:

我正在尝试匹配此 SQL 语句上的 BETWEEN RANGE,如下所示:

( WAEXD8 BETWEEN &WAEXD8 AND &WAEXD8 ) 

上述 SQL 语句适用于 DBS 数据源,虽然通过 ODBC 驱动程序对 iSeries 连接有效,但该 DB 连接类型不适用于 ADO.NET。 ASP.NET ADO 连接需要将 BETWEEN RANGE 替换为以下语法

date(digits(FIELDNAME) CONCAT '000000') <= current date and date(digits(FIELDNAME) CONCAT '000000') >= current date 

WHERE FIELDNAME 是原始 SQL 语句中的 WAEXD8 列...

我已经尝试过,但到目前为止还没有接近这个问题的真正解决方案......

再次,我希望将原始 SQL 查询的 ASP.NET C# 正则表达式匹配/替换为替换字符串,同时保留原始列名。这可能吗?什么是模式或模式示例,我可以这样做?

其他可能的解决方案:

匹配(任意数量的空格,BETWEEN 和 HTML Entity &amp;amp;

例如:([(])|([BETWEEN])*([0-9A-Za-z])*([)])

【问题讨论】:

  • 也许没有别的办法,但你确定需要使用正则表达式来做到这一点吗?请记住:Regular Expressions: Now You Have Two Problems
  • 原始查询不是从源头“只读”的另一种方式,我正在尝试提供一种自动化的清理方法。
  • 这通常不是我的方法,因为我并没有真正做正则表达式模式匹配替换。通常,我会重写查询本身或构建一个正确查询数据的过程,而无需使用花哨的技巧来规范化查询语法。

标签: c# asp.net sql regex


【解决方案1】:

不完全确定你在追求什么,但这里有一些应该涵盖你的例子:

替换所有包含 &amp;amp; 和相同 FIELDNAME 的 BETWEEN 语句

将匹配以下内容:

  • ( WAEXD8 BETWEEN &amp;amp;WAEXD8 AND &amp;amp;WAEXD8 )
  • (WAEXD8 BETWEEN &amp;amp;WAEXD8 AND &amp;amp;WAEXD8)
  • (WAEXD8 BETWEEN &amp;amp;WAEXD8 AND &amp;amp;WAEXD8 )
  • ( WAEXD8 BETWEEN &amp;amp;WAEXD8 AND &amp;amp;WAEXD8 )
  • ( FIELDEXAMPLE1 BETWEEN &amp;amp;FIELDEXAMPLE1 AND &amp;amp;FIELDEXAMPLE1 )

不匹配:

  • ( WAEXD8 BETWEEN WAEXD8 AND WAEXD8 )
  • ( WAEXD8 BETWEEN 0 AND 9000 )
  • ( WAEXD8 BETWEEN &amp;amp;WAEXD8&amp;A;NY1 AND &amp;amp;WAEXD&amp;8ANY2 )
  • ( FIELDEXAMPLE1 BETWEEN &amp;amp;FIELDEXAMPLE2 AND &amp;amp;FIELDEXAMPLE2 )


Regex regexObj = new Regex(@"\(\s*(\w+)\s+BETWEEN\s+&amp;\1\s+AND\s+&amp;amp;\1\s*\)");
resultString = regexObj.Replace(subjectString, "(date(digits($1) CONCAT '000000') <= current date and date(digits($1) CONCAT '000000') >= current date)");

或者,如果您知道字段名称是 AMAZINGFIELDNAME,那么:


Regex regexObj = new Regex(@"\(\s*(AMAZINGFIELDNAME)\s+BETWEEN\s+&amp;\1\s+AND\s+&amp;amp;\1\s*\)");
resultString = regexObj.Replace(subjectString, "(date(digits($1) CONCAT '000000') <= current date and date(digits($1) CONCAT '000000') >= current date)");

用字符“&”和“;”替换所有 BETWEEN 语句

将匹配以下内容:

  • ( WAEXD8 BETWEEN &amp;amp;WAEXD8 AND &amp;amp;WAEXD8 )
  • ( WAEXD8 BETWEEN &amp;amp;WAEXD8&amp;A;NY1 AND &amp;amp;WAEXD&amp;8ANY2 )
  • ( FIELDEXAMPLE1 BETWEEN &amp;amp;FIELDEXAMPLE2 AND &amp;amp;FIELDEXAMPLE2 )


Regex regexObj = new Regex(@"\(\s*(\w+)\s+BETWEEN\s+[\w&amp;;]+\s+AND\s+[\w&amp;;]+\s*\)");
resultString = regexObj.Replace(subjectString, "(date(digits($1) CONCAT '000000') &lt;= current date and date(digits($1) CONCAT '000000') &gt;= current date)");

【讨论】:

  • 是的,它做得非常好……我当时没有发表评论……抱歉耽搁了。
猜你喜欢
  • 2023-03-13
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2015-09-16
  • 2015-11-25
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多