Regex从C#中的复杂SQL SELECT中提取字段

本文关键字:SELECT 提取 字段 SQL Regex 复杂 | 更新日期: 2023-09-27 18:24:51

我正在寻找一个正则表达式(我认为这是最好的方法),它将从复杂的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.字段1
  • A.字段2
  • (B.field1+','+B.field2)
  • (从C_table AS C中选择C.field1,其中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)

因此,除了括号中的逗号之外,可以在每个逗号处进行除法运算。。。

谢谢!

Regex从C#中的复杂SQL SELECT中提取字段

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

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

其中select_clause是从selectfrom

之间提取的字符串

您可以使用以下regex来执行您想要的

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

它匹配开头的parens和结尾parens旁边的任何内容,多个标识符('w_)和点。如果您需要支持更奇特的表标识符(如[Fancy identifier with spaces and brackets].Table.Field1),则需要对其进行调整,但它应该适用于您的问题。

这将使用捕获组。

(?<=选择)?(?=,)|?(?=,)|(.*?)

这应该得到select之后的任何内容,直到字符串结束,该字符串介于2个逗号(,)之间,以及介于开括号和闭括号之间的任何内容。这将适用于.net regex,我认为您正在将其与c#代码一起使用。

如果您知道它已经是一个有效的查询:

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

只要您不使用任何集合,这将适用于MySQL,但根本不使用TSQL。它分为两部分:

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

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

如果你包含集合,你就把它变成了一种非正则语言,因为你必须计算括号的深度。