我正在寻找一个正则表达式(我认为这是最好的方法),它将从复杂的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
或者类似的东西。
输出[]应为:
我已经完成了一个代码来检索SELECT和FROM
之间的字段A.field1, A.field2, (B.field1 + ', ' + B.field2), (SELECT C.field1 FROM C_table AS C WHERE C.Id = A.Id)
因此,除了括号中的那些逗号外,可以除以每个逗号...
谢谢!
答案 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).
如果您包含集合,则会将其转换为非常规语言,因为您必须计算括号深度。