0

我正在寻找一个正则表达式(我认为这是最好的方法),它将从复杂的 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)
  • (从 C_table 中选择 C.field1 作为 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

4 回答 4

0

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

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

其中select_clause是您从SELECTFROM之间提取的字符串

于 2013-07-24T18:27:00.580 回答
0

您可以使用以下正则表达式来做您想做的事

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

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

于 2013-07-24T18:32:38.553 回答
0

这将使用捕获组工作。

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

这应该在 select 之后得到任何内容,直到字符串末尾介于 2 个逗号(,)之间以及开括号和右括号之间的任何内容。这将适用于.net regex,我假设您正在使用您的 c# 代码。

于 2013-07-24T18:35:03.887 回答
0

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

([^'",]+|(["'])((?!\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).

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

于 2013-07-24T20:55:04.373 回答