C#中复杂SQL SELECT的正则表达式提取字段

时间:2013-07-24 18:03:53

标签: c# sql regex subquery match

我正在寻找一个正则表达式(我认为这是最好的方法),它将从复杂的SQL SELECT查询中提取字段。

select A.field1, A.field2, (B.field1 + ', ' +  B.field2), (SELECT C.field1 FROM C_table AS C WHERE C.Id = A.Id) from A_table as A join B_Table as B ON B.AId = A.Id

或者类似的东西。

输出[]应为:

  • A.field1
  • A.field2
  • (B.field1 +','+ B.field2)
  • (SELECT C.field1 FROM C_table AS C WHERE C.Id = A.Id)

我已经完成了一个代码来检索SELECT和FROM

之间的字段
A.field1, A.field2, (B.field1 + ', ' +  B.field2), (SELECT C.field1 FROM C_table AS C WHERE C.Id = A.Id)

因此,除了括号中的那些逗号外,可以除以每个逗号...

谢谢!

4 个答案:

答案 0 :(得分:0)

使用正则表达式, (?![^\(]*?\))拆分第二个字符串 - 拆分任何逗号后跟一个空格,其中下一个右括号不在下一个左括号(如果有)之前。

string[] output = Regex.Split(select_clause, ", (?![^\(]*?\))");

其中 select_clause 是您从 SELECT FROM

之间提取的字符串

答案 1 :(得分:0)

您可以使用以下正则表达式执行您想要的操作

/\([^\(]*\)|([\w_]+\.)*[\w_]*/

它匹配一个开放的parens,后面是关闭parens旁边的任何内容,多个标识符(\w_)后跟点。如果您需要支持更多奇特的表格标识符(例如[Fancy identifier with spaces and brackets].Table.Field1),则需要进行调整,但它应该在您的问题的上下文中工作。

答案 2 :(得分:0)

这将使用捕获组。

(小于?=选择)。?(?=)。?|(?=,)|(?*)

这应该在select之后得到任何东西,直到两个逗号(,)之间的字符串结尾和打开和关闭括号之间的任何内容。这适用于.net正则表达式,我假设您使用的是c#代码。

答案 3 :(得分:0)

如果你知道这是一个有效的查询:

([^'",]+|(["'])((?!\2).|\\\2)*\2)+

只要您没有使用任何集合,而不是TSQL,这将适用于MySQL。它分为两部分:

[^'",]+  Any number of characters that are not ', ", or  a comma.

(["'])((?!\2).|\\\2)*\2  A string. (delimited by double or single quotes).

如果您包含集合,则会将其转换为非常规语言,因为您必须计算括号深度。